python - 可以使用 Python 的 re 模块一次性检索一组任意无序的命名组吗?

标签 python regex unordered

这对于某些问题来说非常方便:

>>> re.search('(?P<b>.b.).*(?P<i>.i.)', 'abcdefghijk').groupdict()
{'i': 'hij', 'b': 'abc'}

但是如果我不知道提前期望的顺序怎么办?

[更新]

例如,假设我有一个包含一些未知字符顺序的输入变量,并且恰好“b”出现在“i”之后。我希望仍然能够引用“.b.”的组和我。'无需根据输入变量中的顺序对我的正则表达式进行排序。所以,我希望我能做这样的事情,但我不知道这是否可能:

>>> re.search('(?P<b>.b.)|(?P<i>.i.)', unknown_order_alphabet_str).groupdict()
{'i': 'hij', 'b': 'abc'}

[结束更新]

我四处搜索并绞尽脑汁,但无法产生任何好的线索。猜测此功能不存在,因为重新执行此操作的唯一方法可能是为每个组扫描一次整个字符串(当然我可以在循环中执行)但我想我会看到 stackoverflow 的大脑不得不说一下。

谢谢你的帮助,
乔希

最佳答案

在 RE 模式中使用竖线(“或”)和 finditer 获取所有感兴趣的匹配对象:每个对象都有一个 groupdict None 作为未参与该匹配的组的值,您可以根据需要“合并”字典。

例如:

import re

def mergedgroupdict(pattern, thestring):
  there = re.compile(pattern)
  result = {}
  for mo in there.finditer(thestring):
    d = mo.groupdict()
    for k in d:
      if k not in result and d[k] is not None:
        result[k] = d[k]
  return result

这使用合并策略,它只是为模式中的每个命名组选择第一个实际匹配项。现在举例

>>> mergedgroupdict('(?P<b>.b.)|(?P<i>.i.)', 'abcdefghijk')
{'i': 'hij', 'b': 'abc'}
>>> mergedgroupdict('(?P<b>.b.)|(?P<i>.i.)', 'abcdefghijk'[::-1])
{'i': 'jih', 'b': 'cba'}

如果我正确解释您的问题,大概如您所愿。

关于python - 可以使用 Python 的 re 模块一次性检索一组任意无序的命名组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2187931/

相关文章:

python - 如何在 python 中使用正则表达式获取前导零的所有索引

java - 查找包含数组中所有单词的字符串的子字符串

python - 强制 pandas.to_excel 将数据写入 'Text' 而不是 'General' 格式

regex - Bash:列出文件的不同前缀

python - 从 Google App Engine python 发送 iOS 推送通知

c# - 正则表达式匹配 C# 代码中的 SQL 关键字

html - 我对这些无序列表做错了什么?

c++ - boost::extension.hpp的原因未为无序容器和其他一些容器定义hash_value()

python - Pandas 按多列分组,过滤并取平均值比率

python - 将数据发布到 Sentiment140 进行情绪分析