如何用Python正则表达式匹配多个模式到同一索引
有没有办法找到所有重叠的匹配项,这些匹配项从同一个位置开始,但属于不同的匹配组呢?
比如,当我在字符串 "ABC" 中寻找模式 "(A)|(AB)" 时,正则表达式应该返回以下匹配结果:
(0,"A") 和 (0,"AB")
2 个回答
3
我明白这个,不过我不记得是从哪里或者谁那里看到的。
def myfindall(regex, seq):
resultlist = []
pos = 0
while True:
result = regex.search(seq, pos)
if result is None:
break
resultlist.append(seq[result.start():result.end()])
pos = result.start() + 1
return resultlist
它会返回一个所有匹配项的列表(包括重叠的匹配),每个索引最多只会有一个匹配。
6
有一种可能性可以参考Evpok的回答。你提问的第二种理解是,你想要从同一个位置同时匹配所有的模式。在这种情况下,你可以使用前瞻表达式。例如,下面这个正则表达式
(?=(A))(?=(AB))
可以给你想要的结果,也就是所有同时匹配这两个模式的地方,以及它们的分组。
更新:根据进一步的说明,这仍然可以用一个正则表达式来完成。你只需要把上面两个分组设为可选的,也就是
(?=(A))?(?=(AB))?(?:(?:A)|(?:AB))
不过我不建议这样做。你可以更简单地分别查找每个模式,然后再把结果合并起来。
string = "AABAABA"
result = [(g.start(), g.group()) for g in re.compile('A').finditer(string)]
result += [(g.start(), g.group()) for g in re.compile('AB').finditer(string)]