2015-04-26 116 views
2

我想在另一个字符串中找到模式([A-Z][0-9]+)+的子字符串。要做到这一点为什么re.findall匹配字符串,但没有正确返回结果?

一种方法是:

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的行为如此?

+0

我关闭这个问题作为一个重复[如何捕获组在JavaScript正则表达式的任意号码?](HTTP ://stackoverflow.com/questions/3537878/how-to-capture-an-arbitrary-number-of-groups-in-javascript-regexp)。这个问题当然不是JavaScript,但是这是同样的问题,很好的解释,你可以应用相同的答案。 – Kobi

+0

这绝对不是这个问题的最佳解决方案,因为Python're.findall'方法非常具体,并且以与JS方法相比更加不同的方式处理正则表达式。 –

回答

2

这是因为您的匹配组一次只匹配一个模式的一个实例。 +只是意味着匹配连续发生的所有事件。它仍然只是一次捕捉比赛的第一部分。

环绕你的正则表达式中的外部组,就像这样:

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

Demo

相关问题