Python에서 정규 표현식을 사용할 때 수정자(modifier), 즉 플래그(flag)를 함께 지정하면 매칭 동작을 세밀하게 제어할 수 있습니다. 수정자는 선택적으로 붙이는 옵션 값으로, 여러 개를 동시에 사용하고 싶다면 배타적 OR 연산자인 |(파이프)로 조합하면 됩니다.
예를 들어 대소문자 구분 없이 검색하면서 여러 줄 모드도 함께 적용하고 싶다면 re.I | re.M처럼 작성할 수 있습니다.
Python 정규 표현식 주요 수정자 목록
| 번호 | 수정자 및 설명 |
|---|---|
| 1 | re.I 대소문자를 구분하지 않는 매칭(case-insensitive matching)을 수행합니다. 'Python'과 'python'을 동일하게 취급합니다. |
| 2 | re.L 현재 로케일(locale) 설정에 따라 단어를 해석합니다. 이 옵션은 알파벳 그룹( \w, \W)뿐만 아니라 단어 경계 동작(\b, \B)에도 영향을 미칩니다. |
| 3 | re.M 여러 줄(multiline) 모드를 활성화합니다. $가 문자열 전체의 끝뿐만 아니라 각 줄의 끝에도 매칭되고, ^ 역시 문자열 시작뿐만 아니라 각 줄의 시작에도 매칭됩니다. |
| 4 | re.S 점(.) 메타 문자가 줄바꿈 문자( \n)를 포함한 모든 문자와 매칭되도록 합니다. 기본 상태에서는 점이 줄바꿈을 제외한 문자에만 매칭됩니다. |
| 5 | re.U 문자를 유니코드(Unicode) 문자 집합 기준으로 해석합니다. 이 플래그는 \w, \W, \b, \B의 동작에 영향을 주며, 한글 등 비 ASCII 문자 처리에 유용합니다. 참고로 Python 3에서는 유니코드 매칭이 기본 동작입니다. |
| 6 | re.X 더 읽기 쉬운(verbose) 정규 표현식 문법을 허용합니다. 공백 문자를 무시하며(문자셋 [] 내부나 백슬래시로 이스케이프된 경우는 예외), 이스케이프되지 않은 #를 주석 기호로 취급합니다. 복잡한 패턴에 설명을 덧붙여 가독성을 높일 때 유용합니다. |
사용 예시
import re
# re.I : 대소문자 구분 없이 검색
result = re.search(r'hello', 'Hello World', re.I)
print(result.group()) # 출력: Hello
# re.M : 여러 줄에서 각 줄의 시작 위치 매칭
lines = re.findall(r'^\d+', '1번째 줄\n2번째 줄', re.M)
print(lines) # 출력: ['1', '2']
# 여러 플래그 조합
result = re.search(r'world.', 'WORLD!\n', re.I | re.S)마무리
정규 표현식 수정자를 잘 활용하면 코드를 더 간결하고 직관적으로 만들 수 있습니다. 특히 re.I와 re.M은 실무에서 가장 자주 사용되는 플래그이므로 꼭 익혀두시길 권장합니다.