这对于某些问题来说非常方便:
>>> 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/