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

时间:2015-04-26 13:20:02

标签: 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']

更有趣的是:

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,而且还声明了一个" group"它可以让你用它做各种各样的事情。我的理论是,由于某些原因,re.findall只将组的最后一个匹配放入结果字符串而不是完全匹配。

为什么re.findall的行为如此?

1 个答案:

答案 0 :(得分:2)

这是因为您的匹配组一次只匹配该模式的一个实例。 +只是意味着匹配连续出现的所有内容。它仍然只能一次捕获比赛的第一部分。

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

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

Demo