정규표현식의 탐욕적 수량자와 게으른 수량자

이 포스트에서는 정규 표헌식에서 탐욕적 수량자와 게으른 수량자의 차이에 대해 설명합니다.

정규 표현식을 사용할 때 의도와는 달리 너무 넓은 범위가 검색되는 경우가 있는데 이 경우는 게으른 수량자를 사용해야 할 상황에서 탐욕적 수량자를 사용한 경우일 수 있습니다.

다음과 같은 파이썬 코드를 봅시다.

import re

strs = '[서울] [광명] [천안아산] [오송] [대전] [김천구미] [동대구] [신경주] [울산] [부산]'
arr = re.findall(r'\[(.*)\]', strs)

print("\n".join(arr))

이 코드를 실행해 보면 다음과 같이 됩니다.

서울] [광명] [천안아산] [오송] [대전] [김천구미] [동대구] [신경주] [울산] [부산

이 코드의 의도는 [] 안에 있는 단어들을 한 줄씩 출력하기 위한 의도였지만 실행 결과는 첫 괄호 시작과 마지막 괄호 끝이 한 덩어리로 묶여 버리는 결과가 나옵니다.

이 코드의 4번 줄을 다음과 같이 수정해 봅시다.

arr = re.findall(r'\[(.*?)\]', strs)

수정된 코드를 실행해 보면 다음과 같이 됩니다.

서울
광명
천안아산
오송
대전
김천구미
동대구
신경주
울산
부산

이렇게 의도한 대로 [] 안에 있는 단어들이 한 줄씩 출력됩니다.

수정된 코드의 차이는 *표 밑에 ?를 붙였냐 안 붙였냐의 차이입니다. ?표를 생략하면 탐욕적 수량자(greedy quantifier), 붙이면 게으른 수량자(lazy quantifier)가 됩니다.
탐욕적 수량자는 정규 표현식에 맞는 범위 안에서 가장 큰 덩어리를 찾으려고 하는 성질이 있고, 게으른 수량자는 반대로 정규 표현식에 맞는 범위 안에서 가장 작은 덩어리를 찾으려고 하는 성질이 있습니다.
여기서 첫 번째 예제가 탐욕적 수량자, 두 번째 예제가 게으른 수량자를 사용한 예입니다.

답글 남기기

이메일 주소는 공개되지 않습니다.