首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么使用regex finditer()而不是findall()

为什么使用regex finditer()而不是findall()
EN

Stack Overflow用户
提问于 2016-09-10 09:50:29
回答 2查看 5.6K关注 0票数 3

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

例如:

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
<_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')

出于好奇,我问了这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-10 09:56:37

有时检索所有匹配项是多余的。如果匹配的数量真的很高,您可能会冒着填满内存的风险,将它们全部加载。

使用迭代器或生成器是现代python中的一个重要概念。也就是说,如果你有一个很小的文本(例如这个网页),优化是微不足道的。

下面是一个关于迭代器的相关问题:Performance Advantages to Iterators?

票数 3
EN

Stack Overflow用户

发布于 2016-09-10 10:07:29

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

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39421746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档