2013-01-11 52 views
1

我想匹配两个字符串变量,并想要捕获多个匹配。 re.findall似乎是这项任务的明显选择,但它看起来并没有像我期望的那样工作。以下是一个例子:Python re.findall问题匹配变量

a = 'a(pp)?le' 
b = 'ale, apple, apol' 
match = re.findall(a,b) 
match 
['','pp'] 

然而,当我应用相同的变量re.search,它识别出字符串内嵌入的正则表达式,并且拾取的第一个匹配:

match = re.search(a,b) 
match.group() 
'ale' 

任何人都可以解释为什么re.findall在这种情况下不工作?我期待以下内容:

match = re.findall(a,b) 
match 
['ale','apple'] 

谢谢!

回答

6

您使用的是捕获组,wheras你想有一个非捕获组:

a = 'a(?:pp)?le' 

象在正则表达式的docs(...)表示将创建一个“捕获组”和re.findall结果将只是在parens里面的东西。

如果您只是想分组东西(例如,为了应用?),请使用(?:...),它会创建一个非捕获组。在这种情况下,re.findall的结果将是整个正则表达式(或最大的捕获组)。

re.findall文档的关键部分是: 如果一个或多个基团存在于该图案,返回组的列表 这解释了在re.findall和re.search结果之间的差。

+0

宾果!非常感谢你的帮助! – user1185790

1

我引述Python docsre.findall()

返回所有字符串模式的非重叠的匹配,因为字符串列表。字符串从左到右扫描,匹配按照找到的顺序返回。 如果模式中存在一个或多个组,请返回组列表;如果模式有多个组,这将是一个元组列表。空结果包含在结果中,除非他们触及另一场比赛的开始。

这就是你的表达a(pp)?le所做的。它与您组中的内容相匹配,即pp。您可以始终通过采取非捕获组(?:...)来禁用该组的特殊行为。

+0

谢谢彼得。我会在下次遇到这些问题时仔细查看文档。 – user1185790