Python 正则表达式 Findall 非贪婪

问题描述

我对正则表达式比较陌生,我似乎很难理解贪婪和非贪婪搜索(如果这确实是这里的问题)。假设我有一个简单的文本,例如:

# 数字:4 A 3 B

我的目标是运行 findall 以获得类似以下输出内容

['# number:','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)) 只匹配“3 B”而不匹配“4 A”?我认为这与 * 的贪婪与非贪婪搜索有关,这是真的吗?如果是这样,您能解释一下如何解决这个问题吗?

提前致谢!

解决方法

我会在这里使用 re.findall 两次。首先,提取数字/非数字文本系列,然后再次使用 re.findall 查找元组:

inp = "# numbers: 4 A 3 B"
text = re.findall(r'^# numbers:\s+(.*)$',inp)[0]
matches = re.findall(r'(\d+)\s+(\D+)',text)
print(matches)  # [('4','A '),('3','B')]