如何使python正则表达式将多个模式匹配到相同的索引

Mik*_*stö 9 python regex match overlapping

是否有可能获得所有重叠匹配,这些匹配从同一索引开始,但来自不同的匹配组?

例如,当我从"ABC"寻找模式"(A)|(AB)"时,正则表达式应该返回以下匹配:

(0,"A")和(0,"AB")

How*_*ard 6

有一种可能性,请参阅Evpok的答案.您的问题的第二种解释可能是您想要从同一位置同时匹配所有模式.在这种情况下,您可以使用超前表达式.例如正则表达式

(?=(A))(?=(AB))
Run Code Online (Sandbox Code Playgroud)

将为您提供所需的结果(即两个模式与组匹配的所有位置).

更新:通过额外的说明,这仍然可以使用单个正则表达式完成.你只需要将两个组都设置为可选,即

(?=(A))?(?=(AB))?(?:(?:A)|(?:AB))
Run Code Online (Sandbox Code Playgroud)

不过我不建议这样做.您可以更轻松地分别查找每个模式,然后加入结果.

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)]
Run Code Online (Sandbox Code Playgroud)


Evp*_*pok 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
Run Code Online (Sandbox Code Playgroud)

它返回所有(甚至重叠)匹配的列表,每个索引的匹配限制不超过一个。