이 포스트에서는 정규 표헌식에서 탐욕적 수량자와 게으른 수량자의 차이에 대해 설명합니다.
정규 표현식을 사용할 때 의도와는 달리 너무 넓은 범위가 검색되는 경우가 있는데 이 경우는 게으른 수량자를 사용해야 할 상황에서 탐욕적 수량자를 사용한 경우일 수 있습니다.
다음과 같은 파이썬 코드를 봅시다.
import re strs = '[서울] [광명] [천안아산] [오송] [대전] [김천구미] [동대구] [신경주] [울산] [부산]' arr = re.findall(r'\[(.*)\]', strs) print("\n".join(arr))
이 코드를 실행해 보면 다음과 같이 됩니다.
서울] [광명] [천안아산] [오송] [대전] [김천구미] [동대구] [신경주] [울산] [부산
이 코드의 의도는 [] 안에 있는 단어들을 한 줄씩 출력하기 위한 의도였지만 실행 결과는 첫 괄호 시작과 마지막 괄호 끝이 한 덩어리로 묶여 버리는 결과가 나옵니다.
이 코드의 4번 줄을 다음과 같이 수정해 봅시다.
arr = re.findall(r'\[(.*?)\]', strs)
수정된 코드를 실행해 보면 다음과 같이 됩니다.
서울 광명 천안아산 오송 대전 김천구미 동대구 신경주 울산 부산
이렇게 의도한 대로 [] 안에 있는 단어들이 한 줄씩 출력됩니다.
수정된 코드의 차이는 *표 밑에 ?를 붙였냐 안 붙였냐의 차이입니다. ?표를 생략하면 탐욕적 수량자(greedy quantifier), 붙이면 게으른 수량자(lazy quantifier)가 됩니다.
탐욕적 수량자는 정규 표현식에 맞는 범위 안에서 가장 큰 덩어리를 찾으려고 하는 성질이 있고, 게으른 수량자는 반대로 정규 표현식에 맞는 범위 안에서 가장 작은 덩어리를 찾으려고 하는 성질이 있습니다.
여기서 첫 번째 예제가 탐욕적 수량자, 두 번째 예제가 게으른 수량자를 사용한 예입니다.