python - 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 提供有用的答案!
解决方案
这是因为re.findall()
有一个时只返回捕获组中的子字符串,而re.search()
返回一个Match
对象,当你调用对象的group()
方法时Match
,它返回匹配整个正则表达式的子字符串,而不考虑捕获组。
如果要re.findall()
返回整个匹配的子字符串,则应改用非捕获组:
re.findall('g(?:oal){3}', p) # returns ['goaloaloal']
推荐阅读
- machine-learning - 实现骰子损失的正确方法是什么?sigmoid 还是 softmax?
- python - python子进程模块调用方法
- angular-material-7 - 如何根据ngx mat select search得到的值过滤mat表中的数据
- python - Pandas:按列和索引的条件选择行
- python - Python - 如何找到与其所有邻居相比的最大数量
- list - SwiftUI:围绕 UITableView 实现包装器以实现自定义 List-like 视图
- python - 根据每个唯一 ID 的最新时间过滤数据帧,将所有其他数据保留在数据帧中
- vuejs2 - VueJS 的 Select2 中的多选。有时返回空白选中
- python - 拼接字符串以获取第一个空格左侧和右侧空格右侧的所有内容
- c - 'ptr = &array[index]' 和 '*ptr = array[index]' 有什么区别?