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

6 python regex unordered

这对于一些问题非常方便:

>>> 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大脑是什么不得不说.

谢谢你的帮助,
乔希

Ale*_*lli 1

在 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)

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