C.W.K.
Stream
Lesson 09 of 10 · published

정규식 쓰면 안 되는 자리

~10 min · limits, anti-patterns, html-parsing

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

그 유명한 Stack Overflow 답변

SO 에 "정규식으로 HTML 파싱하는 법" 물으면, "He comes." 로 끝나는 그 유명한 unhinged-but-correct 답변이 와. 가르치는 교훈은 진짜야: 정규식은 파서가 아냐.

정규식이 진짜 못 하는 것

중첩 구조. 임의 깊이의 균형 잡힌 괄호 매칭은 정규 언어가 아냐. ((a)) vs (((a))) 는 카운팅이 필요하고, 순수 정규식은 못 세. 일부 PCRE 엔진이 recursion ((?R)) 추가해서 흉내내지만, 그건 이미 정규식 이론을 떠난 거.

HTML / XML / Markdown / JSON / YAML / 소스 코드. 다 중첩 구조. 파서 써. Python 은 html.parser, lxml, json, yaml. JavaScript 는 DOMParser, JSON.parse. 모든 언어가 모든 진짜 포맷에 대해 진짜 파서를 가지고 있어.

의미 검증. 정규식은 모양 체크는 하지만 의미는 못 봐. \d{4} 는 "9999" 매칭해 — 근데 9999 가 유효한 연도야? 코드가 필요해.

Unicode 깊은 자리. 우횡서 (RTL) 스크립트, emoji ZWJ 시퀀스, combining 글자, locale 별 케이싱. 정규식이 \p{...} 와 Unicode 플래그로 *건들* 수는 있지만 거의 항상 잘못된 도구.

스멜 테스트

패턴이 100자 넘거나, 중첩 그룹 4개 이상, lookbehind 로 컨텍스트 추적 흉내내고 있으면 — 멈춰. 매칭이 아니라 파싱하려는 거야. 옳은 도구로 손 뻗어: HTML 파서, YAML 라이브러리, 손으로 쓴 토크나이저, AST walker.

정규식은 모양 감지. 문제가 구조적으로 변하는 순간, 넘겨.

Code

잘못된 도구, 옳은 도구·python
# WRONG — HTML 에서 정규식으로 <a href> 추출
import re
links = re.findall(r'<a\s+href="([^"]+)"', html)
# 깨지는 자리: 작은따옴표, 속성 순서 다양, 멀티라인 태그,
# escape 된 따옴표, 주석, CDATA... 끝없음.

# RIGHT — 진짜 HTML 파서 사용
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
links = [a['href'] for a in soup.find_all('a', href=True)]
# 모든 엣지 케이스 정확. 영원히.

External links

Exercise

본인 코드베이스에서 80자 넘는 정규식 하나 audit 해. 묻기: 모양 감지 (좋음) 아니면 구조 파싱 (나쁨)? 파싱이면 진짜 파서가 어떤 모양일지 스케치. 오늘 다시 안 써도 돼 — 그 라인을 인지만 해.

Progress

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

댓글 0

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

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