如何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))