Python正则表达式Findall非贪婪
我对regex比较陌生,我似乎很难理解贪婪与非贪婪搜索(如果这确实是这里的问题的话)。假设我有这样一个简单的文本: #数字:4 A 3 B 我的目标是运行findall以获得如下输出: ['#编号:'、'4 A 3 B'、'4 A'、'3 B'] 因此,如果我将以下正则表达式与findall一起使用,我希望它能够工作:Python正则表达式Findall非贪婪,python,regex,findall,Python,Regex,Findall,我对regex比较陌生,我似乎很难理解贪婪与非贪婪搜索(如果这确实是这里的问题的话)。假设我有这样一个简单的文本: #数字:4 A 3 B 我的目标是运行findall以获得如下输出: ['#编号:'、'4 A 3 B'、'4 A'、'3 B'] 因此,如果我将以下正则表达式与findall一起使用,我希望它能够工作: matches = re.findall(r"(# numbers:)(((?:\s\d)(?:\s\D))*)", "# numbers: 4 A
matches = re.findall(r"(# numbers:)(((?:\s\d)(?:\s\D))*)", "# numbers: 4 A 3 B")
然而,实际输出如下:
[(“#数字:”、“4 A 3 B”、“3 B”)]
有人能解释为什么组((\s\d)(\d\d))只匹配“3B”而不匹配“4A”吗?我想这与贪婪和非贪婪的搜索有关,是真的吗?如果是,你能解释一下如何解决这个问题吗
提前谢谢 我会在这里使用
re.findall
两次。首先,提取数字/非数字文本序列,然后再次使用re.findall
查找元组:
inp=“#数字:4 A 3 B”
text=re.findall(r'^#数字:\s+(.*)$,inp)[0]
matches=re.findall(r'(\d+)\s+(\d+),文本)
打印(匹配)#[('4','A'),('3','B')]
谢谢你的建议!我也想过,但我想知道为什么第一个解决方案不起作用。如果在“findall”中找到任何组,我会假设它们都会被搜索并返回。为什么只有最后一个,你知道吗?你用了:(((?:\s\d)(?:\s\d))*)
。。。这将整个重复模式放在一个捕获组中,Python的正则表达式引擎只“记住”最后一个匹配。我看到了,你知道是否没有办法每次找到重复模式时都“记住”它吗?你当前的方法是不可挽救的,因此我的解决方法。谢谢你的输入,但我仍然不明白为什么re.findall(r'(\d+)\s+(\d+),text)可以找到所有模式,而re.findall(r'(\d+)\s+(\d+*),text(with)却不能。另外,关于findall(r'(\d+)\s+(\d+)?),text(带*?)似乎也能正常工作。奇怪的