python - 为什么使用正则表达式 finditer() 而不是 findall()

标签 python regex match string-matching iterable

如果 findall() 足够好,使用 finditer() 有什么好处? findall() 返回所有匹配项,而 finditer() 返回不能像静态列表那样直接处理的匹配对象。

例如:

import re
CARRIS_REGEX = (r'<th>(\d+)</th><th>([\s\w\.\-]+)</th>'
                r'<th>(\d+:\d+)</th><th>(\d+m)</th>')
pattern = re.compile(CARRIS_REGEX, re.UNICODE)
mailbody = open("test.txt").read()
for match in pattern.finditer(mailbody):
    print(match)
print()
for match in pattern.findall(mailbody):
    print(match)

输出:

<_sre.SRE_Match object at 0x00A63758>
<_sre.SRE_Match object at 0x00A63F98>
<_sre.SRE_Match object at 0x00A63758>
<_sre.SRE_Match object at 0x00A63F98>
<_sre.SRE_Match object at 0x00A63758>
<_sre.SRE_Match object at 0x00A63F98>
<_sre.SRE_Match object at 0x00A63758>
<_sre.SRE_Match object at 0x00A63F98>

('790', 'PR. REAL', '21:06', '04m')
('758', 'PORTAS BENFICA', '21:10', '09m')
('790', 'PR. REAL', '21:14', '13m')
('758', 'PORTAS BENFICA', '21:21', '19m')
('790', 'PR. REAL', '21:29', '28m')
('758', 'PORTAS BENFICA', '21:38', '36m')
('758', 'SETE RIOS', '21:49', '47m')
('758', 'SETE RIOS', '22:09', '68m')

我出于好奇问这个。

最佳答案

finditer() 返回一个迭代器,而 findall() 返回一个数组。迭代器只有在您通过调用 .next() 请求它时才会工作。 for 循环知道在迭代器上调用 .next(),这意味着如果您提前从循环中 break,则不会执行任何后续匹配。另一方面,数组需要完全填充,这意味着必须预先找到每个匹配项。

迭代器的内存和 CPU 效率更高,因为它们一次只需要加载一个项目。如果您要匹配一个非常大的字符串(百科全书可能是几百兆字节的文本),试图一次找到所有匹配项可能会导致浏览器在搜索时挂起并可能耗尽内存。

关于python - 为什么使用正则表达式 finditer() 而不是 findall(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39421746/

相关文章:

javascript - 使用 python 从输入字段复制文本并将其保存到变量中

python - pytest 的错误

javascript - 将模式与输入字段的最大长度结合起来

regex - 从日志文件中删除日期

c# - 如何从字符串中获取id值

php - MYSQL PHP 搜索功能 INNER JOIN 不需要

Python正则表达式匹配特定字符串和结束字符之间的字符串

python - 按常见项目排序

mongodb - 如何在mongodb中使用substr函数?

python - 从python数组中分割偶数/奇数行的最短方法?