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

겁먹게 만드는 이유 — 왜 정규식이 무서워 보이나

~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. 상세 모드

대부분 엔진에는 패턴을 여러 줄로 펼치고 주석을 다는 플래그가 있어. Python은 re.VERBOSE 또는 re.X, PCRE는 x 플래그를 써.

이 모드를 켜면 같은 패턴이 평범한 코드처럼 읽혀. 패턴 안의 공백은 무시돼. 리터럴 공백이 필요하면 \ 또는 [ ]를 쓰고, #부터는 주석으로 읽어.

2. 조각으로 만들고 이름 붙이기

상세 모드가 없어도 이름 붙은 구성 조각으로 패턴을 조립할 수 있어. 실서비스 정규식은 이렇게 만들어야 오래 버텨.

관점 전환

정규식은 한 번 쓰고 버리는 문장이 아냐. 나중에 반복해서 읽히지. 80자 안에 욱여넣은 패턴보다 공백, 주석, 이름 붙은 그룹을 갖춘 패턴이 미래의 작업자를 살려줘. 다음 사람이 2주 뒤의 자신이어도 똑같아.

Code

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

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

# 상세 모드 — 같은 엔진, 더 나은 가독성
email_readable = re.compile(r'''
    ^                       # 문자열 시작
    [a-zA-Z0-9_.+-]+        # 로컬 부분: 문자, 숫자, _.+-
    @                       # 리터럴 @
    [a-zA-Z0-9-]+           # 도메인 이름
    \.                      # 리터럴 점
    [a-zA-Z0-9-.]+          # TLD, 서브도메인 허용
    $                       # 문자열 끝
''', re.VERBOSE)
이름 붙은 조각으로 조립·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

위 이메일 패턴을 사용 중인 언어의 상세 모드로 다시 써봐. 상세 모드가 없다면 이름 붙은 조각으로 나눠. 의미 있는 조각마다 주석을 달고 소리 내어 읽어봐. 그 정도는 되어야 실서비스에 넣을 만해.

Progress

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

댓글 0

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

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