这对于一些问题非常方便:
>>> re.search('(?P<b>.b.).*(?P<i>.i.)', 'abcdefghijk').groupdict()
{'i': 'hij', 'b': 'abc'}
Run Code Online (Sandbox Code Playgroud)
但是,如果我不知道提前订购的顺序怎么办?
[更新]
例如,假设我有一个包含一些未知字符顺序的输入变量,恰好"b"出现在'i'之后.我仍然希望能够引用'.b'的组.和我.' 无需根据输入var中的顺序来命令我的正则表达式.所以,我希望我能做到这样的事情,但我不知道是否有可能:
>>> re.search('(?P<b>.b.)|(?P<i>.i.)', unknown_order_alphabet_str).groupdict()
{'i': 'hij', 'b': 'abc'}
Run Code Online (Sandbox Code Playgroud)
[结束更新]
我四处搜寻并绞尽脑汁但却无法产生任何好的线索.猜测这个功能是不存在的,因为重新做这个的唯一方法就是为每个组扫描整个字符串一次(当然我可以在一个循环中做)但是我想我会看到stackoverflow大脑是什么不得不说.
谢谢你的帮助,
乔希
在 RE 模式中使用竖线(“或”),并finditer获取所有感兴趣的匹配对象:每个对象都有一个groupdictwithNone作为不参与该匹配的组的值,并且您可以根据需要“合并”字典。
例如:
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
Run Code Online (Sandbox Code Playgroud)
这使用了合并策略,该策略只是为模式中的每个命名组选择第一个实际匹配。现在举例
>>> 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'}
Run Code Online (Sandbox Code Playgroud)
如果我正确解释你的问题,大概如你所愿。