如何find与正则expression式的重叠匹配?

>>> match = re.findall(r'\w\w', 'hello') >>> print match ['he', 'll'] 

由于\ w \ w表示两个字符,所以“他”和“ll”是预期的。 但为什么'el'和'lo' 匹配正则expression式呢?

 >>> match1 = re.findall(r'el', 'hello') >>> print match1 ['el'] >>> 

findall不会默认产生重叠匹配。 然而,这个expression式:

 >>> re.findall(r'(?=(\w\w))', 'hello') ['he', 'el', 'll', 'lo'] 

这里(?=...)是一个超前的断言

(?=...)

匹配if ...匹配next,但不消耗任何string。 这被称为超前断言。 例如, Isaac (?=Asimov)只有跟随着'Asimov'才会匹配'Isaac ' 'Asimov'

您可以使用支持重叠匹配的新Python正则expression式模块 。

 >>> import regex as re >>> match = re.findall(r'\w\w', 'hello', overlapped=True) >>> print match ['he', 'el', 'll', 'lo'] 

除了零长度断言之外,input中的字符将始终在匹配中消耗。 如果你曾经想要在inputstring中捕获特定字符,那么你需要在正则expression式中使用零长度的断言。

有几个零长度的断言(例如^ (input/行的开始), $ (input/行的结尾), \b (单词边界)),但是环视( (?<=)正向后视和(?=)正面预测)是您可以从input中捕获重叠文本的唯一方法。 消极的观察( (?<!)负面的后视, (?!)负面预测)在这里并不是很有用:如果他们声明为真,那么捕获内部失败; 如果他们断言错误,那么比赛失败。 这些断言是零长度的(如前所述),这意味着它们将断言而不消耗inputstring中的字符。 如果断言通过,它们实际上会匹配空string。

应用上面的知识,适用于你的情况的正则expression式是:

 (?=(\w\w))