본문 바로가기
프로그래밍/정규표현식

[정규 표현식] re 모듈 알아보기 (3) finditer 사용법과 findall과의 차이

by 부자 꽁냥이 2022. 10. 1.

이번  포스팅에서는 re 모듈에서 finditer 사용법과 이와 비슷한 findall과 finditer의 차이가 무엇인지 알아보려고 한다.


   finditer 사용법과 findall 과의 차이

1) finditer 사용법

finditer는 패턴과 검사 문자열을 입력받아서 매칭되는 부분이 있다면 Match 객체로 이루어진 Iterator를 리턴한다. finditer의 사용법은 다음과 같다.


finditer( 패턴, 검사 문자열 )


아래 코드를 통해 실제 사용법을 익힐 수 있다.

 

import re

pattern = r'\d+\s'

string = '1234 5678 1313'

print([x for x in re.finditer(pattern, string)]) ## Match 객체 출력
print([x.group() for x in re.finditer(pattern, string)]) ## 매칭되는 문자열 출력

 

 

위에서 보듯이 finditer는 패턴 매칭이 되었다면 Match 객체로 이루어진 Iterator를 리턴한다. 실제로 결과를 보기 위해서 리스트 컴프리헨션(Comprehension)으로 불러왔다. 또한 Match 객체가 아닌 실제로 패턴 매칭된 문자열을 출력하고 싶다면 group을 써야 한다.


2) finditer vs findall

언뜻 보면 finditer가 패턴 매칭이 되는 모든 부분을 찾는다는 점에서 findall과 같아보일 수 있다. 하지만 내가 직접 사용하면서 느낀 차이점은 다음과 같다.

a. finditer는 순회가능한 Iterator 객체를 리턴하고 findall은 리스트를 리턴한다.

finditer는 Match 객체가 담긴 Iterator를 리턴 하지만 findall은 패턴 매칭된 문자열이 담긴 리스트를 리턴한다. 따라서 finditer에서 패턴 매칭된 문자열이 보고 싶다면 리스트 컴프리헨션과 같은 방법을 사용해야 한다.

 

import re

pattern = r'\d+\s'

string = '1234 5678 1313'

print(re.finditer(pattern, string)) ## Match 객체가 담긴 Iterator
print([x.group() for x in re.finditer(pattern, string)]) ## 매칭되는 문자열 출력

print(re.findall(pattern, string)) ## findall은 매칭되는 문자열이 담긴 리스트 출력

 

b. findall은 패턴 그룹 매칭시 그룹에 저장되어 있는 결과만을 리턴 하지만 finditer는 패턴 그룹을 포함한 전체 패턴 매칭 결과를 리턴한다.

아래 코드에서 findall은 전체 패턴 <(h[0-9])>[a-zA-Z\s]*<\1>이 매칭된 경우 패턴 그룹 (h[0-9])에 저장된 부분만을 저장하여 리턴한다(Group Capturing). 하지만 finditer는 전체 패턴이 매칭된 문자열을 리턴한다.

string = '<h1>Hello<h1>, <h2>World<h2>, <h3>My Blog<h5>'
pattern = re.compile(r'<(h[0-9])>[a-zA-Z\s]*<\1>')

print(re.findall(pattern, string))
print([x.group() for x in list(re.finditer(pattern, string))])

 

 

이게 정말 큰 차이인 듯하다. 따라서 패턴 그룹이 포함되어 있는 상황에서 전체 패턴 매칭 결과를 얻고 싶다면 finditer를 사용하는 것이 좋다.


댓글


맨 위로