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

정규식 디버깅

~8 min · debugging, tools

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

작은 재현 입력부터 만들어

실패하는 입력과 성공해야 하는 입력을 가장 작은 형태로 줄이고, 패턴과 기대 결과를 함께 기록해. 온라인 도구를 사용할 수 있다면 민감 정보를 제거한 재현 입력을 regex101에 넣고 배포 환경과 가장 가까운 정규식 방언을 선택해. 최종 결과는 반드시 실제 엔진에서도 확인해야 해.

엔진이 패턴을 어떻게 읽는지 확인해

Python의 re.compile(pattern, re.DEBUG)는 컴파일된 명령을 출력해. 그룹 범위, 선택의 결합 순서, 수량자가 실제로 어디에 붙었는지 확인할 때 유용해.

패턴을 구획별로 줄여 가며 검사해

매칭해야 할 입력을 놓친다면 완성된 패턴만 바라보지 말고 작은 구획부터 다시 붙여 봐.

  1. 고정 접두사나 첫 그룹만 테스트해.
  2. 다음 구획을 하나씩 추가해.
  3. 기대 결과가 처음 달라지는 지점에서 이스케이프, 경계, 수량자 범위를 확인해.

패턴을 임의의 문자 위치에서 반으로 자르면 문법 자체가 달라질 수 있으므로 의미 있는 구획 단위로 나눠야 해.

전체 매칭과 캡처를 모두 출력해

매칭은 되지만 값이 잘못됐다면 전체 매칭, 각 그룹, 이름 붙은 그룹, 위치를 함께 살펴봐.

m = pattern.search(text)
if m:
    print(m.group(0))      # 전체 매칭
    print(m.groups())      # 번호 그룹
    print(m.groupdict())   # 이름 붙은 그룹
    print(m.span())        # 시작과 끝 위치

증상은 출발점일 뿐이야

  • 매칭이 없음: 앵커, 이스케이프, 플래그, API의 차이를 확인해.
  • 너무 넓게 매칭: 탐욕적 수량자와 경계 조건을 확인해.
  • 너무 좁게 매칭: 선택 구간과 문자 클래스가 실제 입력을 포함하는지 확인해.
  • 특정 입력에서 매우 느림: 중첩 수량자나 겹치는 대안이 만드는 백트래킹을 측정해.
  • 테스터와 코드의 결과가 다름: 엔진 방언, 플래그, 호스트 문자열의 이스케이프를 비교해.

Code

디버깅 도구·python
import re

# 컴파일된 명령 확인
re.compile(r'(a|ab)c', re.DEBUG)

# 각 매칭의 위치와 그룹 출력
pattern = re.compile(r'(\w+)\s+(\w+)')
text = 'hello world foo bar'
for m in pattern.finditer(text):
    print(f'pos {m.start():3} matched {m.group()!r} groups={m.groups()}')

# 문법 오류를 먼저 분리
try:
    re.compile(r'your pattern')
except re.error as exc:
    print(f'pattern syntax error: {exc}')

# 성공, 실패, 경계 입력을 표로 검사
for inp in ['known good', 'known bad', 'edge case']:
    m = pattern.search(inp)
    print(f'{inp!r}: {m.group() if m else None}')

External links

Exercise

코드에서 가장 복잡한 정규식을 찾아 실제 런타임과 같은 엔진 설정으로 regex101에서 열어. 설명 패널을 따라 각 조각의 역할을 적고, 예상하지 못한 동작을 발견하면 재현 입력과 함께 기록해.

Progress

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

댓글 0

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

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