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 에 붙여 넣기

버그가 뭐든 본인 첫 액션은: 패턴 복사, 입력 복사, 옳은 flavor 선택된 regex101.com 에 둘 다 붙여 넣기. 설명 패널이 패턴 분해; 매칭 패널이 무엇이 맞고 안 맞는지 보여줘.

정규식 버그 절반이 시각화 보기 전엔 invisible.

Python 디버그 플래그

re.compile(pattern, re.DEBUG) 가 컴파일된 state machine print. 엔진이 본인 패턴 실제로 어떻게 파싱하는지 이해에 유용.

Narrowing 기법

패턴이 "매칭해야 할 거 안 매칭" 할 때 절반으로 자르기:

  1. 패턴 첫 절반 잡고 입력에 테스트. 매칭?
  2. 둘째 절반. 입력이 기대하는 거 가짐?
  3. 실패 시작하는 경계 찾기.

이 bisection 이 전체 패턴 응시보다 이슈 빠르게 찾음.

캡처 로깅

이슈가 "매칭하지만 잘못된 거 캡처" 면 모든 그룹 print:

m = pattern.search(text)
if m:
    print(m.group(0))      # 전체 매칭
    print(m.groups())      # 번호 그룹
    print(m.groupdict())   # named 그룹
    print(m.span())        # 위치

흔한 버그 시그니처

  • "None 반환": 아마 anchoring 또는 잘못된 escape (raw string?).
  • "너무 많이 매칭": greedy vs lazy, 또는 word boundary 빠짐.
  • "너무 적게 매칭": optional 조각 빠짐, 잘못된 character class.
  • "Hang": catastrophic backtracking. 중첩 quantifier 찾기.
  • "테스터에선 동작, 코드에선 실패": flavor 미스매치 또는 string escape 이슈.

Code

디버깅 도구·python
import re

# 컴파일된 state machine print
re.compile(r'(a|ab)c', re.DEBUG)
# 패턴의 엔진 view 출력

# 위치별로 입력 walk
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 e:
    print(f'pattern syntax error: {e}')

# 한 번에 여러 입력 테스트
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

본인 코드의 가장 복잡한 정규식 찾기. 매칭 flavor 로 regex101 에 붙여 넣기. 설명 패널 읽기. 각 조각 다 이해? 본인 패턴이 하고 있는 거 본인이 몰랐던 거 발견했으면 정상 — 그리고 정확히 이 디버깅 단계의 가치.

Progress

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

댓글 0

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

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