본문 바로가기
C.W.K.
Stream
Lesson 03 of 10 · published

Python re.compile()와 re.VERBOSE

~8 min · python, compile, verbose

Level 0패턴 호기심
0 XP0/90 lessons0/15 achievements
0/100 XP to next level100 XP to go0% complete

재사용할 패턴 컴파일하기

re.compile(pattern).search, .findall, .sub 같은 메서드를 가진 패턴 객체를 반환해. 같은 패턴을 여러 곳에서 쓴다면 이름을 붙인 객체 하나로 의도를 분명하게 드러낼 수 있어.

모듈 수준의 re.search 같은 함수도 최근 사용한 패턴을 내부에서 캐시하므로, 명시적인 컴파일이 언제나 더 빠른 것은 아니야. 성능을 추측하기보다 반복해서 쓸 중요한 패턴을 한곳에 정의하고, 필요하면 실제 작업량으로 측정해.

VERBOSE 플래그

re.VERBOSE의 별칭은 re.X야. 이 플래그를 사용하면 공백과 주석을 넣은 여러 줄 패턴을 작성할 수 있어.

  • 문자 클래스 밖의 공백은 무시돼. 실제 공백을 매칭하려면 \s, \ , 또는 문자 클래스를 사용해.
  • 문자 클래스 밖의 이스케이프되지 않은 #부터 줄 끝까지는 주석이 돼.

긴 패턴의 구획과 의도를 눈에 보이게 만들 때 특히 유용해.

플래그 결합하기

re.compile(pattern, re.VERBOSE | re.MULTILINE | re.IGNORECASE)처럼 | 연산자로 여러 플래그를 결합할 수 있어.

인라인 플래그

패턴 시작의 (?ix)는 패턴 전체에 IGNORECASEVERBOSE를 적용해. (?ix:...)처럼 범위를 묶으면 특정 구간에만 플래그를 적용할 수도 있어.

Code

컴파일과 상세 모드·python
import re

# 재사용 가능한 컴파일 패턴
EMAIL = re.compile(r'[\w.+-]+@[\w-]+\.[\w.-]+')

for line in lines:
    for match in EMAIL.finditer(line):
        print(match.group())

# 가독성을 높이는 VERBOSE 모드
DATE = re.compile(r'''
    (?P<year>\d{4})    # 네 자리 연도
    -
    (?P<month>\d{2})   # 두 자리 월
    -
    (?P<day>\d{2})     # 두 자리 일
''', re.VERBOSE)

m = DATE.match('2026-05-04')
print(m.groupdict())
# {'year': '2026', 'month': '05', 'day': '04'}

# 플래그 결합
LOG = re.compile(
    r'^ERROR:\s+(.*)$',
    re.MULTILINE | re.IGNORECASE
)

# 같은 뜻의 인라인 플래그
LOG = re.compile(r'(?im)^ERROR:\s+(.*)$')

External links

Exercise

코드에서 긴 정규식 하나를 골라 VERBOSE 모드와 이름 붙은 그룹을 사용한 모듈 수준의 컴파일 패턴으로 바꿔 봐. m.group(1) 대신 m.group('name')을 썼을 때 호출 코드만 읽어도 뜻이 드러나는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.