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

Intimidation Factor — 왜 정규식이 무서워 보이나

~8 min · psychology, readability, verbose-mode

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

문자 밀도가 문제야

정규식이 무서워 보이는 건 정보 밀도 때문이야. ^(?:[a-zA-Z0-9_'^&/+-])+(?:\.(?:[a-zA-Z0-9_'^&/+-])+)*@(?:(?:\[?(?:[0-9]{1,3}\.){3}[0-9]{1,3}\]?)|(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,})$ 같은 패턴은 프로그래밍 어떤 문법보다도 인치당 의미가 빽빽해. 눈이 파싱을 거부해.

이건 진짜 인지 한계야, 개인 결함이 아니라. 두 가지 기법이 해결해.

1. Verbose / extended 모드

대부분 엔진이 패턴을 여러 줄에 펼치고 주석 다는 플래그 지원해. Python 은 re.VERBOSE (또는 re.X). PCRE 는 x 플래그.

갑자기 같은 패턴이 평범한 코드처럼 읽혀. 패턴 안의 공백은 무시 (literal 공백 필요하면 \ 또는 [ ] 사용); # 가 주석 시작.

2. 조각으로 빌드, 조각에 이름 붙이기

verbose 모드 없이도 named building block 으로 패턴 조립 가능. 실제 코드베이스의 production 정규식이 이렇게 생겼어.

마인드셋 전환

정규식은 write-once 가 아냐. *반복해서 읽혀*. 미래의 본인이 고마워할 버전은 80 컬럼에 욱여넣은 거 말고 공백, 주석, named group 박힌 거야. 다음 사람을 위해 써 — 다음 사람이 2주 뒤의 본인이라도.

Code

같은 패턴, 두 가독성 레벨·python
import re

# 잡음 벽
email_terse = re.compile(r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$")

# Verbose 모드 — 가독, 같은 엔진
email_readable = re.compile(r'''
    ^                       # 문자열 시작
    [a-zA-Z0-9_.+-]+        # local part: 문자, 숫자, _.+-
    @                       # 리터럴 at
    [a-zA-Z0-9-]+           # 도메인 이름
    \.                      # 리터럴 점
    [a-zA-Z0-9-.]+          # TLD (서브도메인 허용)
    $                       # 문자열 끝
''', re.VERBOSE)
named 조각으로 조립·python
import re

LOCAL = r"[a-zA-Z0-9_.+-]+"
DOMAIN = r"[a-zA-Z0-9-]+"
TLD = r"[a-zA-Z0-9-.]+"
EMAIL = re.compile(rf"^{LOCAL}@{DOMAIN}\.{TLD}$")

EMAIL.match("hi@example.com")  # <re.Match ...>

External links

Exercise

위 코드 블록의 이메일 패턴을 본인 언어에서 verbose 모드 (없으면 named composition) 로 다시 써 봐. 의미 있는 조각마다 주석 달아. 소리 내서 읽어 봐. production 품질 정규식의 느낌이 그거야.

Progress

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

댓글 0

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

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