如何用Python正则表达式匹配多个模式到同一索引

9 投票
2 回答
6613 浏览
提问于 2025-04-16 18:11

有没有办法找到所有重叠的匹配项,这些匹配项从同一个位置开始,但属于不同的匹配组呢?

比如,当我在字符串 "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)]

撰写回答