问题描述
我对正则表达式比较陌生,我似乎很难理解贪婪和非贪婪搜索(如果这确实是这里的问题)。假设我有一个简单的文本,例如:
# 数字:4 A 3 B
['# 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')]