본문 바로가기
파이썬

파이썬 re.finditer와 re.findall의 다른 동작

by º기록 2020. 11. 3.
반응형

다음 코드를 사용하고 있습니다.

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 모두에서 사용해 보았습니다.

finditer findall 의 한 가지 차이점은 전자는 정규식 일치 개체를 반환하는 반면 다른 하나는 일치 된 캡처 그룹의 튜플 (또는 캡처 그룹이없는 경우 전체 일치)을 반환한다는 것입니다. ).

그래서

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')

findall 에서 얻은 것과 동일한 finditer 의 출력을 원하면 다음이 필요합니다.

for match in pattern.finditer(mailbody):
    print(tuple(match.groups()))

 

참조 페이지 https://stackoverflow.com/questions/3765024

 

 

반응형

댓글