【发布时间】:2018-07-29 05:27:09
【问题描述】:
我在 Python 中有一个包含多个命名组的正则表达式。但是,如果先前的组已匹配,则可能会错过匹配一组的模式,因为似乎不允许重叠。举个例子:
import re
myText = 'sgasgAAAaoasgosaegnsBBBausgisego'
myRegex = re.compile('(?P<short>(?:AAA))|(?P<long>(?:AAA.*BBB))')
x = re.findall(myRegex,myText)
print(x)
产生输出:
[('AAA', '')]
“长”组未找到匹配项,因为“AAA”在为前面的“短”组寻找匹配项时已用尽。
我试图找到一种允许重叠的方法,但失败了。作为替代方案,我一直在寻找一种方法来分别运行每个命名组。类似于以下内容:
for g in myRegex.groupindex.keys():
match = re.findall(***regex_for_named_group_g***,myText)
是否可以为每个命名组提取正则表达式?
最终,我想生成一个字典输出(或类似的),例如:
{'short':'AAA',
'long':'AAAaoasgosaegnsBBB'}
我们将不胜感激地接受任何和所有建议。
【问题讨论】:
-
没有正则表达式引擎允许在同一位置测试两个有效匹配项。不过,您可以在模式中使用重叠组,例如 in this demo
-
感谢您提供信息和链接 - 该解决方案非常有趣。但是,我将使用的正则表达式是由一个简单的算法生成的,并且每个命名组的结构都由一个“|”分隔。 (OR) 字符。因此,在这种情况下嵌套正则表达式是不可行的。但仍然是一个非常有用的提示。
-
好的,所以你必须单独运行正则表达式,或者如果可能的话完全放弃正则表达式。
-
@Wiktor Stribiżew 是的,我认为你是对的。我添加了一些技巧来尝试自动化单独运行正则表达式并将结果整理到字典中的过程。
标签: python regex python-3.x