Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带括号的正则表达式前瞻_Python_Regex - Fatal编程技术网

Python 带括号的正则表达式前瞻

Python 带括号的正则表达式前瞻,python,regex,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)),'bbbbbb')的作用 编辑2:明白了!感谢您的回复。问题在于捕获组在“前瞻”中 要执行您想要的操作,您必须捕获字母,然后使用不捕

re.findall('(?=(b))','bbbb')
到底在做什么?它返回
['b','b','b','b']
,但我期望
['b','b','b']
,因为它应该只在前面看到另一个'b'时返回'b'

谢谢

编辑:似乎
re.findall('b(?=(b)),'bbbb')
像我期望的那样返回
['b','b','b']
,但我仍然不清楚
re.findall('(?=(b)),'bbbbbb')
的作用


编辑2:明白了!感谢您的回复。

问题在于捕获组在“前瞻”中

要执行您想要的操作,您必须捕获字母,然后使用不捕获的前瞻:

re.findall('(b)(?=b)','bbbb')
结果:

['b', 'b', 'b']
这里有一个零长度的匹配,还有一个捕获组。当
re.findall
的正则表达式具有捕获组时,生成的列表将是那些捕获组中捕获的内容(如果有)

正则表达式匹配四个位置:字符串的开头、第一个
b
之前、第二个
b
之前和第三个
b
之前。这是一个图表,其中
|
表示匹配的位置(添加空格用于说明):

如果您不想要捕获组,而只想匹配零长度位置,请使用
(?:
而不是
用于非捕获组:

(?=(?:b))

(虽然生成的列表将由空字符串组成,并且不会非常有用)

正向前瞻
(?=
断言一个位置,该位置被发现了4次,因为有4个位置后面跟着一个b。在该断言中,您在一个捕获组中捕获一个
(b)
,该捕获组将由返回

如果要返回三次a
b
,并且不再引用该组,可以匹配
b
,并添加一个前瞻,断言右侧是a
b

print(关于findall('b(?=b'),'bbbb'))


它从输入字符串的第一个索引开始,如果您执行
re.findall('(?=(bb))','bbbb')
并输出
['bb','bb','bb']
我重新打开了这个问题,因为它不是在问,而且是一个无用的重复目标,永远不应该用作重复目标。不需要非捕获组。
(?:b)
可以是
b
(?=(?:b))