我正在尝试匹配两个字符串变量,并希望捕获多个匹配项。 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']
谢谢!
答案 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
。您始终可以通过获取非捕获组(?:...)
来禁用组的这种特殊行为。