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

파이썬 정규식 그룹화 완벽 이해하기: 캡처 그룹과 백레퍼런스

정규식 그룹화(Grouping)란?

파이썬 정규식에서 그룹화는 패턴의 일부를 괄호 ( )로 감싸는 방식으로 수행합니다. 그룹화의 핵심 목적은 개별 문자가 아닌 전체 그룹에 연산자나 수량자를 적용할 수 있게 하는 것입니다.

예를 들어 ab+는 'a' 뒤에 'b'가 하나 이상 오는 패턴을 의미하지만, (ab)+는 'ab'라는 묶음 자체가 하나 이상 반복되는 패턴을 의미합니다. 이처럼 괄호 하나만으로도 패턴의 의미가 완전히 달라집니다.

캡처 그룹(Capturing Groups)과 백레퍼런스

괄호는 단순히 하위 표현식을 묶는 역할만 하는 것이 아닙니다. 괄호로 감싸진 부분은 캡처 그룹을 생성하며, 해당 그룹이 매칭한 문자열 조각은 백레퍼런스(backreference)라는 곳에 저장됩니다.

저장된 백레퍼런스를 활용하면 정규식 내에서 이미 매칭된 부분을 재사용할 수 있습니다. 예를 들어 \1, \2 같은 역참조 표기를 사용해 앞서 캡처한 첫 번째, 두 번째 그룹과 동일한 텍스트를 다시 매칭할 수 있습니다. 반복되는 단어나 태그 검증 등에 유용하게 쓰입니다.

선택(Alternation)과 함께 활용하기

실무에서는 두 개 이상의 대안 중 하나와 일치하는 정규식이 필요한 경우가 많습니다. 또한 수량자(quantifier)가 여러 표현식 전체에 적용되기를 원할 때도 있습니다. 이러한 요구 사항은 모두 괄호를 이용한 그룹화세로 막대(|)를 이용한 선택(alternation)으로 해결할 수 있습니다.

선택은 여러 후보 중 어느 하나와 매칭하고 싶을 때 유용합니다. 예를 들어 정규식 aircraft|airplane|jet은 'aircraft', 'airplane', 'jet' 중 하나를 포함하는 모든 텍스트와 일치합니다. 같은 목표는 air(craft|plane)|jet처럼 공통 부분인 'air'를 그룹 밖으로 빼내어 더 간결하게 표현할 수도 있습니다.

예제 코드

다음은 캡처 그룹을 활용해 문자열에서 단어들만 추출하는 파이썬 예제입니다.

import re

s = 'Tahiti $% Tahiti *&^ 34 Atoll'
result = re.findall(r'(\w+)', s)
print(result)

위 코드에서 r'(\w+)' 패턴은 하나 이상의 단어 문자(알파벳, 숫자, 언더스코어)에 해당하는 부분을 캡처 그룹으로 묶어 찾아냅니다. re.findall() 함수는 매칭된 모든 결과를 리스트 형태로 반환합니다.

실행 결과

['Tahiti', 'Tahiti', '34', 'Atoll']

특수문자($%, *&^ 등)는 \w에 해당하지 않으므로 제외되고, 숫자 '34'는 단어 문자에 포함되므로 결과에 함께 나타납니다. 이처럼 그룹화와 캡처를 활용하면 복잡한 문자열에서 원하는 데이터만 손쉽게 추출할 수 있습니다.