>>> match = re.findall(r'\w\w', 'hello')
>>> print match
['he', 'll']
由于\ W \ W表示两个字符,“他”和“LL”的预期。但为什么“厄尔尼诺”和“LO”不匹配正则表达式?
>>> match1 = re.findall(r'el', 'hello')
>>> print match1
['el']
>>>
findall
不会产生默认重叠的匹配。然而,这确实表达:
>>> re.findall(r'(?=(\w\w))', 'hello')
['he', 'el', 'll', 'lo']
这里(?=...)
是lookahead assertion:
(?=...)
匹配,如果...
下一个比赛,但不消耗任何的字符串。这就是所谓的前向断言。例如,Isaac (?=Asimov)
将匹配'Isaac '
只有当它的后面'Asimov'
。
您可以使用new Python regex module,它支持重叠匹配。
>>> import regex as re
>>> match = re.findall(r'\w\w', 'hello', overlapped=True)
>>> print match
['he', 'el', 'll', 'lo']
除了零长度断言,字符在输入将总是在匹配消耗。如果你是曾经在要捕获输入字符串的某些性格比较一次的情况下,你需要在正则表达式零长度断言。
有几个零长度断言(如^
(输入/线),$
(输入/行尾),\b
(字边界)的开始),但查找变通((?<=)
正面看,后面(?=)
积极前瞻)是可以捕获从输入文字重叠的唯一途径。负查找变通((?<!)
负向后看,(?!)
负前瞻)不是非常有用这里:如果他们断言属实,那么捕获内部失败;如果他们断言假,那么匹配失败。这些断言是零长度(如前面提到的),这意味着它们将断言而无需在输入字符串消耗的字符。如果断言通过他们将所匹配空字符串。
应用上述知识,即适用于你的情况将是一个正则表达式:
(?=(\w\w))
我没有正则表达式的专家,但我想我的回答类似question。
如果你想使用一个捕获组与前瞻:
例如正则表达式:(\ d)(= \ 1?)。
字符串:5252
这将匹配第一5以及第一2
的(\ d)是使捕获基,(?= \ d \ 1)是匹配任意数字,然后由捕获组1不消耗串,从而允许重叠