我正在使用以下代码:

CARRIS_REGEX=r'<th>(\d+)</th><th>([\s\w\.\-]+)</th><th>(\d+:\d+)</th><th>(\d+m)</th>'
pattern = re.compile(CARRIS_REGEX, re.UNICODE)
matches = pattern.finditer(mailbody)
findall = pattern.findall(mailbody)

但是finditer和findall正在寻找不同的东西。 Findall确实找到了给定字符串中的所有匹配项。但是finditer只找到第一个,返回仅包含一个元素的迭代器。

如何使finditer和findall行为相同?

谢谢

最佳答案

我在这里无法重现。在Python 2.7和3.1上都尝试过。
finditerfindall之间的一个区别是,前者返回正则表达式匹配对象,而另一个返回匹配的捕获组(如果没有捕获组则为整个匹配)的元组。

所以

import re
CARRIS_REGEX=r'<th>(\d+)</th><th>([\s\w\.\-]+)</th><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获得相同的输出,则需要
for match in pattern.finditer(mailbody):
    print(tuple(match.groups()))

关于python - re.finditer和re.findall之间的行为不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3765024/

10-11 08:53