匹配变量时Python re.findall的问题

时间:2013-01-11 17:35:26

标签: python regex variables

我正在尝试匹配两个字符串变量,并希望捕获多个匹配项。 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']

谢谢!

2 个答案:

答案 0 :(得分:6)

您正在使用捕获组,而您想要一个非捕获组:

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

如正则表达式中的docs (...)所述,将创建一个“捕获组”,而re.findall的结果将仅仅是parens中的内容。

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

re.findall文档的关键部分是: 如果模式中存在一个或多个组,请返回组列表 这解释了re.findall和re.search之间的结果差异。

答案 1 :(得分:1)

让我引用关于re.findall()的{​​{3}}:

  

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

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