我想在另一个字符串中找到模式([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
的行为如此?
答案 0 :(得分:2)
这是因为您的匹配组一次只匹配该模式的一个实例。 +
只是意味着匹配连续出现的所有内容。它仍然只能一次捕获比赛的第一部分。
将你的正则表达式包装在一个外部组中,如下所示:
((?:[A-Z][0-9]+)+)