是否可以获取所有重叠匹配项,这些匹配项从相同的索引开始,但来自不同的匹配组?
例如,当我从“ABC”中查找模式“(A)|(AB)”时,正则表达式应返回以下匹配项:
(0,“A”)和(0,“AB”)
是否可以获取所有重叠匹配项,这些匹配项从相同的索引开始,但来自不同的匹配组?
例如,当我从“ABC”中查找模式“(A)|(AB)”时,正则表达式应返回以下匹配项:
(0,“A”)和(0,“AB”)
关于这个问题的一种可能解释请参见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)]
re.compile('AB').finditer(string)
真的有用吗? re.finditer('AD',string)
应该就可以了,或者如果你非常想要预编译它,那么在列表推导式之外进行编译也可以起到澄清表达式的作用。 - Evpokdef 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
它返回一个所有匹配项(甚至重叠的)的列表,每个索引只能有一个匹配项的限制。