如何找到一个正则表达式匹配的重叠?

问题描述 投票:55回答:4
>>> match = re.findall(r'\w\w', 'hello')
>>> print match
['he', 'll']

由于\ W \ W表示两个字符,“他”和“LL”的预期。但为什么“厄尔尼诺”和“LO”不匹配正则表达式?

>>> match1 = re.findall(r'el', 'hello')
>>> print match1
['el']
>>>
python regex overlapping
4个回答
90
投票

findall不会产生默认重叠的匹配。然而,这确实表达:

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

这里(?=...)lookahead assertion

(?=...)匹配,如果...下一个比赛,但不消耗任何的字符串。这就是所谓的前向断言。例如,Isaac (?=Asimov)将匹配'Isaac '只有当它的后面'Asimov'


31
投票

您可以使用new Python regex module,它支持重叠匹配。

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

10
投票

除了零长度断言,字符在输入将总是在匹配消耗。如果你是曾经在要捕获输入字符串的某些性格比较一次的情况下,你需要在正则表达式零长度断言。

有几个零长度断言(如^(输入/线),$(输入/行尾),\b(字边界)的开始),但查找变通((?<=)正面看,后面(?=)积极前瞻)是可以捕获从输入文字重叠的唯一途径。负查找变通((?<!)负向后看,(?!)负前瞻)不是非常有用这里:如果他们断言属实,那么捕获内部失败;如果他们断言假,那么匹配失败。这些断言是零长度(如前面提到的),这意味着它们将断言而无需在输入字符串消耗的字符。如果断言通过他们将所匹配空字符串。

应用上述知识,即适用于你的情况将是一个正则表达式:

(?=(\w\w))

0
投票

我没有正则表达式的专家,但我想我的回答类似question

如果你想使用一个捕获组与前瞻:

例如正则表达式:(\ d)(= \ 1?)。

字符串:5252

这将匹配第一5以及第一2

的(\ d)是使捕获基,(?= \ d \ 1)是匹配任意数字,然后由捕获组1不消耗串,从而允许重叠

© www.soinside.com 2019 - 2024. All rights reserved.