正则表达式用括号括起来

时间:2018-09-30 08:54:47

标签: python regex

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:明白了!谢谢您的答复。

3 个答案:

答案 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)

正向超前(?=断言一个位置被发现4次,因为a跟随在4个位置。在该断言本身中,您捕获了findall返回的捕获组中的(b)

如果您想返回一次b的三倍,并且不再参考该组,则可以匹配b并添加一个前瞻性,断言右侧是{{ 1}}

b

Demo