re.findall('(?=(b))','bbbb')
到底在做什么?它返回['b', 'b', 'b', 'b']
,但我期望['b', 'b', 'b']
,因为它只有在看到另一个'b'的情况下才应该返回'b'?
谢谢!
编辑:似乎re.findall('b(?=(b))','bbbb')
返回['b', 'b', 'b']
就像我期望的那样,但是我对re.findall('(?=(b))','bbbb')
所做的事情仍然感到困惑。
编辑2:明白了!谢谢您的答复。
答案 0 :(得分:3)
您在那里有一个零长度匹配,和您有一个捕获组。当re.findall
的正则表达式具有捕获组时,结果列表将是在那些捕获组(如果有)中捕获的内容。
四个位置由您的正则表达式匹配:字符串的开头,第一个b
之前,第二个b
之前和第三个b
之前。这是一张图,其中|
表示匹配的位置(为说明起见添加了空格):
b b b b
| captures the next b, passes
b b b b
| captures the next b, passes
b b b b
| captures the next b, passes
b b b b
| captures the next b, passes
b b b b
| lookahead fails, match fails
如果您不想使用捕获组,而只想匹配零长度位置,则对非捕获组使用(?:
而不是(
:
(?=(?:b))
(尽管结果列表将由空字符串组成,并且不会很有用)
答案 1 :(得分:2)
问题在于捕获组位于内部内部。
要执行所需的操作,必须捕获字母,然后使用不捕获的前瞻:
re.findall('(b)(?=b)','bbbb')
结果:
['b', 'b', 'b']
答案 2 :(得分:2)