如何在 Python 中找到正则表达式的所有匹配项?
- 2024-12-09 08:30:00
- admin 原创
- 91
问题描述:
当我使用该re.search()
函数在文本块中查找匹配项时,一旦找到文本块中的第一个匹配项,程序就会退出。
我该如何重复执行此操作,直到找到所有匹配项后程序才会停止?是否有单独的函数可以执行此操作?
解决方案 1:
使用re.findall
或re.finditer
代替。
re.findall(pattern, string)
返回匹配字符串的列表。
re.finditer(pattern, string)
返回对象的迭代器MatchObject
。
例子:
re.findall( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')
# Output: ['cats', 'dogs']
[x.group() for x in re.finditer( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')]
# Output: ['all cats are', 'all dogs are']
解决方案 2:
另一种方法(虽然已经过去了 13 年,但仍然与 OP 的初衷保持一致)是编译模式并调用search()
已编译的模式并沿着模式移动。这有点冗长,但如果您不想进行前瞻等操作,或者想要更明确地搜索字符串,则可以使用以下函数。
import re
def find_all_matches(pattern, string, group=0):
pat = re.compile(pattern)
pos = 0
out = []
while m := pat.search(string, pos):
pos = m.start() + 1
out.append(m[group])
return out
pat = r'all (.*?) are'
s = 'all cats are smarter than dogs, all dogs are dumber than cats'
find_all_matches(pat, s) # ['all cats are', 'all dogs are']
find_all_matches(pat, s, group=1) # ['cats', 'dogs']
这也适用于重叠匹配:
find_all_matches(r'(ww)', "hello") # ['he', 'el', 'll', 'lo']
解决方案 3:
如果您有兴趣获取所有匹配项(包括重叠匹配项,与@Amber 的答案不同),有一个名为REmatch 的新库,它专门用于生成文本上正则表达式的所有匹配项,包括所有重叠匹配项。该工具支持一种更通用的带有捕获的正则表达式语言,称为 REQL。
例如,正则表达式!x{...}
将给出三个连续字符的所有三元组(包括重叠三元组)。
该方法应该比@cottontail 的答案(在输入字符串中是一般二次函数)更有效。
您可以在此处在线尝试 REmatch ,并在此处获取 Python 代码。
免责声明:我认识该工具的作者。:)
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD