Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 정규표현식: re.findall()과 re.finditer() 메서드의 차이점 완벽 정리

Python의 re 모듈에는 정규표현식으로 문자열을 검색할 때 유용하게 쓰이는 두 가지 메서드가 있습니다. 바로 re.findall()re.finditer()입니다. 두 메서드 모두 패턴과 일치하는 모든 항목을 찾아준다는 점에서 비슷하지만, 반환하는 결과의 형태와 활용 방식에서 중요한 차이가 있습니다.


re.findall() 메서드

re.findall()은 주어진 문자열에서 패턴과 일치하는 모든 부분을 찾아 리스트(list) 형태로 반환합니다. 문자열을 처음부터 끝까지 훑으면서 패턴에 해당하는 모든 항목을 수집하며, 일치하는 결과가 없으면 빈 리스트를 돌려줍니다.

단순히 패턴의 존재 여부만 확인하는 re.search()re.match()와 달리, 일치하는 모든 결과를 한 번에 얻을 수 있기 때문에 실무에서 가장 널리 사용되는 검색 메서드입니다.

예제

import re

result = re.findall(r'TP', 'TP Tutorials Point TP')
print(result)

출력 결과

['TP', 'TP']

위 예제에서 볼 수 있듯이, re.findall()은 문자열 내에 패턴이 나타난 모든 위치의 값을 리스트로 묶어 반환합니다.


re.finditer() 메서드

re.finditer(pattern, string, flags=0)은 정규표현식 패턴과 일치하는 모든 부분에 대해 MatchObject(매치 객체)를 담는 이터레이터(iterator)를 반환합니다. 문자열은 왼쪽에서 오른쪽으로 스캔되며, 매칭 결과는 발견된 순서대로 제공됩니다. 빈 매칭(empty match)도 결과에 포함됩니다.

이터레이터를 반환하기 때문에 전체 결과를 한꺼번에 메모리에 올리지 않고 하나씩 순회할 수 있어, 대용량 텍스트를 처리할 때 특히 유리합니다. 또한 각 매치 객체에서 start(), end(), span() 등의 메서드를 사용해 매칭된 위치 정보까지 얻을 수 있다는 점이 큰 장점입니다.

예제

import re

s1 = 'Blue Berries'
pattern = 'Blue Berries'

for match in re.finditer(pattern, s1):
    s = match.start()
    e = match.end()
    print(f'문자열 "{s1[s:e]}"이 {s}:{e} 위치에서 일치했습니다.')

출력 결과

문자열 "Blue Berries"이 0:12 위치에서 일치했습니다.

두 메서드의 핵심 차이점 비교

구분 re.findall() re.finditer()
반환값 일치한 문자열(또는 그룹)의 리스트 MatchObject를 담는 이터레이터
메모리 사용 전체 결과를 즉시 생성하여 저장 지연 평가(lazy evaluation)로 순회 시마다 생성
위치 정보 매칭된 값만 제공 start(), end(), span() 등 위치 정보 제공
적합한 상황 간단히 모든 매칭 값을 추출할 때 대용량 데이터 처리 또는 매칭 위치가 필요할 때

정리

결론적으로, 단순히 일치하는 문자열들의 목록만 필요하다면 re.findall()이 간편하고 직관적입니다. 반면 매칭된 문자열의 시작·끝 위치 같은 세부 정보가 필요하거나, 방대한 텍스트를 효율적으로 처리해야 한다면 re.finditer()를 사용하는 것이 좋습니다. 두 메서드의 특성을 잘 이해하고 상황에 맞게 선택하면 더 깔끔하고 효율적인 정규표현식 코드를 작성할 수 있습니다.