C.W.K.
Stream
Lesson 11 of 12 · published

정규식 포기할 때

~8 min · limits, tooling, judgment

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

멈춰야 할 신호

일부 패턴이 잘못된 전투 싸우는 중. 본인 정규식이 라인 넘은 신호:

  1. 패턴이 100자 넘고 자라는 중. 모양 매칭 아니라 파싱 중.
  2. 입력 가로질러 컨텍스트 추적 필요. "Quoted 문자열 안, X 무시" — 그건 lexer 일, 정규식 아님.
  3. 카운트 또는 균형 필요. 중첩 괄호, 균형 따옴표 — 정의상 비-정규.
  4. 재귀 필요. (?R) 가 테이블에 있으면 정규식 졸업.
  5. 3+ 정규식 패스 chain 중. 아마 파서 원함.
  6. 패턴이 포매팅 변경에 fragile. 떠도는 공백 하나가 깨뜨림.
  7. 소리 내서 못 읽음. Production-ready 정규식이 가독해야.

대신 손 뻗을 거

중첩 구조 위한 파서:

  • HTML / XML → BeautifulSoup, lxml, DOMParser
  • JSON → json.loads, JSON.parse
  • YAML → PyYAML, js-yaml
  • 소스 코드 → AST (Python ast, JS Babel parser)
  • 커스텀 DSL → 진짜 lexer/parser 작성 (PLY, Lark, nom, ANTLR)

알려진 포맷 위한 specialized 라이브러리:

  • URL → urllib.parse, new URL()
  • 날짜 → datetime, dateutil, date-fns
  • 전화 → libphonenumber
  • IP → ipaddress, net.IP
  • 버전 → packaging.version, semver

재구성

옳은 도구 손 뻗기가 패배 인정 X — senior 판단. 입문자가 정규식 알고 있는 망치라서 모든 거에 손 뻗음. 경험 많은 엔지니어가 정규식이 실제 푸는 문제와 그냥 미루는 문제 구분 앎.

Code

옳은 도구 비교·python
# WRONG — JSON 정규식 파싱
import re
# JSON-like 텍스트에서 'name' 추출 시도
re.findall(r'"name":\s*"([^"]+)"', '{"name": "pippa", "data": {"name": "x"}}')
# ['pippa', 'x']  — 두 'name' 필드 다 잡음, but escape 따옴표에 깨짐

# RIGHT — json 사용
import json
data = json.loads('{"name": "pippa", "data": {"name": "x"}}')
print(data['name'])  # 'pippa'
print(data['data']['name'])  # 'x'

# WRONG — 손으로 날짜 파싱
re.match(r'(\d{4})-(\d{2})-(\d{2})', '2026-05-04')
# 그 다음 파싱, 그 다음 검증, 그 다음 윤년 처리...

# RIGHT — datetime 사용
from datetime import datetime
dt = datetime.strptime('2026-05-04', '%Y-%m-%d')
# 검증, 파싱, 엣지 케이스 처리

# WRONG — 소스 코드 파싱
re.findall(r'def\s+(\w+)\(', code)
# 주석, 문자열, 데코레이터에 fragile

# RIGHT — AST 사용
import ast
tree = ast.parse(code)
for node in ast.walk(tree):
    if isinstance(node, ast.FunctionDef):
        print(node.name)

External links

Exercise

본인 코드베이스 잡고 80자 넘는 정규식 하나 찾기. 솔직히 평가: 모양 감지 또는 구조 파싱? 파싱이면 진짜 라이브러리 또는 파서가 어떤 모양일지 스케치. 다시 안 써도 — 그 라인 인지만.

Progress

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

댓글 0

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

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