【发布时间】:2017-01-18 04:55:12
【问题描述】:
如果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')
出于好奇,我问这个问题。
【问题讨论】:
-
匹配对象包含更多关于匹配的信息。
-
为什么使用
(i for i in iterable )而不是[i for i in iterable]?同样正如 BrenBarn 评论的那样,您可以使用许多属性,例如.start.end等。使用 finditer,它基本上是课程的马匹,您想做什么,在某些情况下,您选择什么并不重要。跨度> -
findall对于许多用例来说确实足够了。没有必要使用finditer,除非您想从匹配对象中获取更多详细信息,或者正在处理足够大的数据以使搜索短路或减小返回数据的大小很重要。通常不会。 -
非常感谢您的回答!
标签: python regex match string-matching iterable