-1

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

谢谢!

4

2 回答 2

7

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

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

如正则表达式中的文档 (...)所述,将创建一个“捕获组”,并且 re.findall 的结果将只是括号内的内容。

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

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

于 2013-01-11T17:41:32.523 回答
1

让我引用Python文档re.findall()

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

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

于 2013-01-11T17:46:28.067 回答