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)
,该捕获组将由返回
如果要返回三次ab
,并且不再引用该组,可以匹配b
,并添加一个前瞻,断言右侧是ab
print(关于findall('b(?=b'),'bbbb'))
它从输入字符串的第一个索引开始,如果您执行
re.findall('(?=(bb))','bbbb')
并输出['bb','bb','bb']
我重新打开了这个问题,因为它不是在问,而且是一个无用的重复目标,永远不应该用作重复目标。不需要非捕获组。(?:b)
可以是b
。
(?=(?:b))