首页 > 解决方案 > re.search() 和 re.findall() 在查找正则表达式模式(Python)方面是否不同?

问题描述

我的问题的演示如下:

我的代码:

p = "goalgoalgoalgoalllllgoaloaloal'

print(re.search('g(oal){3}',p).group())

re.findall('g(oal){3}',p)

输出:

goaloaloal
['oal']

使用相同的正则表达式模式,re.search() 发现匹配为“goaloaloal”,正如我预期的那样。然而,re.findall()发现匹配是“oal”,这真的让我感到惊讶。有人可以帮忙解释造成差异的原因吗?先感谢您:-)

说明:对于看似重复的内容,我们深表歉意。这个问题的最初目的是在处理正则表达式模式中的括号时找到 re.research() 和 re.findall() 方法之间的确切区别。我以前什至不知道“捕获”这个词。更具体地说,我想知道如何使用 re.findall() 方法准确提取“goaloaloal”模式。感谢@blhsing 提供有用的答案!

标签: pythonregex

解决方案


这是因为re.findall()有一个时只返回捕获组中的子字符串,而re.search()返回一个Match对象,当你调用对象的group()方法时Match,它返回匹配整个正则表达式的子字符串,而不考虑捕获组。

如果要re.findall()返回整个匹配的子字符串,则应改用非捕获组:

re.findall('g(?:oal){3}', p) # returns ['goaloaloal']

推荐阅读