Python 为什么re.findall与字符串匹配,但没有正确返回结果?

Python 为什么re.findall与字符串匹配,但没有正确返回结果?,python,regex,string,Python,Regex,String,我想在另一个字符串中找到模式([a-Z][0-9]+)+的子字符串 一种方法是: import re re.findall("([A-Z][0-9]+)+", "asdf A0B52X4 asdf")[0] 奇怪的是,这会产生'X4',而不是'A0B52X4',这是我所期望的结果 对此进行了深入研究,我还尝试只匹配字符串所包含的简单组: re.findall("[A-Z][0-9]+", "asdf A0B52X4 asdf") 这将产生预期的结果:['A0','B52','X4'] 更有趣

我想在另一个字符串中找到模式
([a-Z][0-9]+)+
的子字符串

一种方法是:

import re
re.findall("([A-Z][0-9]+)+", "asdf A0B52X4 asdf")[0]
奇怪的是,这会产生
'X4'
,而不是
'A0B52X4'
,这是我所期望的结果

对此进行了深入研究,我还尝试只匹配字符串所包含的简单组:

re.findall("[A-Z][0-9]+", "asdf A0B52X4 asdf")
这将产生预期的结果:
['A0','B52','X4']

更有趣的是:

re.findall("([A-Z][0-9]+){3,}", "asdf A0B52X4 asdf")
这会产生
['X4']
,但似乎仍然与我感兴趣的整个字符串相匹配,通过尝试
re.search
并使用结果手动获取子字符串来确认:

m = re.search("([A-Z][0-9]+)+", "asdf A0B52X4 asdf")
m.string[m.start():m.end()]
这将产生
“A0B52X4”

现在,根据我对python中正则表达式的了解,括号不仅匹配它们内部的RE,而且还声明了一个“组”,它允许您使用它执行各种操作。我的理论是,出于某种原因,
re.findall
只将组的最后一个匹配项放入结果字符串,而不是完整匹配项


为什么
re.findall
的行为是这样的?

这是因为您的匹配组一次只匹配模式的一个实例。
+
只是指匹配一行中出现的所有代码。它仍然一次只捕获比赛的第一部分

将正则表达式包装在外部组中,如下所示:

((?:[A-Z][0-9]+)+)

我把这个问题作为一个重复的问题结束了。当然,这个问题不是JavaScript,但这是同一个问题,解释得很好,您可以应用相同的答案。对于这个问题,它绝对不是最好的复制品,因为Python
re.findall
方法非常具体,并且处理正则表达式的方式与任何JS方法都大不相同。