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

Python 정규식에서 물음표(?) 리터럴을 사용하는 이유와 활용 방법

파이썬(Python) 정규 표현식에서 물음표 리터럴('?')은 여러 가지 방식으로 사용되는 다재다능한 메타 문자입니다. 이 글에서는 물음표가 어떤 의미를 가지는지, 그리고 실제로 어떻게 활용되는지 자세히 살펴보겠습니다.

특수 문자로서의 '?'

물음표가 특수 문자(special character)로 사용되면, 바로 앞에 있는 정규 표현식(RE)이 0번 또는 1번 나타나는 경우와 일치하도록 만듭니다. 즉, 해당 요소를 선택 사항(optional)으로 취급하는 역할을 합니다.

예를 들어 ab?는 'a' 또는 'ab'와 모두 일치합니다. 'b'가 있어도 되고 없어도 되기 때문입니다.

파이썬 문서에서 설명하는 '?'의 주요 용도

파이썬 공식 문서(re 모듈)에 따르면 물음표 리터럴 '?'는 다음과 같은 방식으로 활용됩니다.

1. 수량자를 비탐욕적(non-greedy)으로 만들기

*?, +?, ??

'*', '+', '?' 수량자는 기본적으로 모두 탐욕적(greedy)입니다. 즉, 가능한 한 많은 텍스트를 일치시키려고 시도합니다.

그런데 때로는 이러한 동작이 원하는 결과가 아닐 수 있습니다. 예를 들어 정규 표현식 <.*>를 문자열 '<a> b <c>'에 적용하면 '<a>'만이 아니라 전체 문자열이 통째로 일치해 버립니다.

이때 수량자 뒤에 '?'를 붙이면 매칭이 비탐욕적(non-greedy) 또는 최소 매칭(minimal) 방식으로 수행되어, 가능한 한 적은 문자만 일치시킵니다. 따라서 정규 표현식 <.*?>를 사용하면 '<a>'만 정확히 일치하게 됩니다.

2. 비캡처 그룹(non-capturing group)

(?:...) 형태로 사용하면 패턴을 그룹으로 묶으면서도 매칭 결과를 별도로 캡처하지 않습니다. 그룹화 기능만 필요하고 캡처가 불필요할 때 유용하게 쓰입니다.

3. 전방 탐색과 후방 탐색(lookahead / lookbehind)

(?=...), (?!...), (?<=...), (?<!...) 형태의 어설션에서도 물음표가 사용됩니다. 이들은 실제로 문자를 소비하지 않으면서 특정 패턴의 존재 여부만 확인할 때 활용됩니다.

이처럼 물음표 하나가 위치와 조합에 따라 완전히 다른 기능을 수행하기 때문에, 파이썬 정규 표현식을 다룰 때 '?'의 각 용도를 정확히 이해해 두는 것이 중요합니다.