Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.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正则表达式Findall非贪婪_Python_Regex_Findall - Fatal编程技术网

Python正则表达式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

我对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 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(带*?)似乎也能正常工作。奇怪的