如果findall()足够好,使用finditer()的好处是什么?findall()返回所有匹配,而finditer()返回match对象,它不能像静态列表那样直接处理。
例如:
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')出于好奇,我问了这个问题。
发布于 2016-09-10 09:56:37
有时检索所有匹配项是多余的。如果匹配的数量真的很高,您可能会冒着填满内存的风险,将它们全部加载。
使用迭代器或生成器是现代python中的一个重要概念。也就是说,如果你有一个很小的文本(例如这个网页),优化是微不足道的。
下面是一个关于迭代器的相关问题:Performance Advantages to Iterators?
发布于 2016-09-10 10:07:29
finditer()返回迭代器,而findall()返回数组。只有当您通过调用.next()来请求迭代器时,它才会起作用。for循环知道在迭代器上调用.next(),这意味着如果您早期从循环执行break,则不会执行后面的任何匹配。另一方面,数组需要完全填充,这意味着必须预先找到每个匹配项。
迭代器的内存和CPU效率要高得多,因为它们一次只需要加载一项。如果您正在匹配一个非常大的字符串(百科全书可能有几百兆字节的文本),尝试一次查找所有匹配项可能会导致浏览器在搜索时挂起,并可能耗尽内存。
https://stackoverflow.com/questions/39421746
复制相似问题