본문 바로가기
C.W.K.
Stream
Lesson 08 of 12 · published

특수 글자 이스케이프 — 언제, 어떻게

~8 min · escaping, metacharacters, raw-strings

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

백슬래시는 특수 문자를 리터럴로, 리터럴을 특수 문자로 바꿔

두 가지 사실만 기억하면 돼.

  1. 메타문자를 글자 그대로 매칭하려면 앞에 백슬래시를 붙여. \.는 점, \$는 달러 기호, \\는 백슬래시를 매칭해.
  2. 평범한 문자에 특수한 뜻을 주려면 역시 백슬래시를 붙여. \d는 숫자, \b는 단어 경계, \n은 줄바꿈이야.

백슬래시는 정규식에서 의미를 뒤집는 스위치야.

원시 문자열로 이중 해석을 막아

Python을 비롯한 많은 언어에서 백슬래시는 문자열 이스케이프이기도 해. 그래서 Python 문자열 안의 "\d"는 정규식 엔진에 도착하기 전에 문자열 파서가 먼저 해석해. 어떤 때는 우연히 괜찮고, 어떤 때는 조용히 패턴을 망쳐.

정규식 패턴에는 원시 문자열이나 그 언어의 등가 문법을 써. Python과 Rust에서는 r"\d+", JavaScript에서는 정규식 리터럴 /\d+/이 같은 역할을 해.

원시 문자열을 쓰지 않으면 Python의 "\d"는 우연히 백슬래시를 보존하지만 "\b"는 코드 포인트 8인 ASCII 백스페이스가 돼. 겉으로는 멀쩡한 패턴이 조용히 틀어지지.

변수를 넣을 때는 전용 이스케이프 함수

사용자 입력이나 변수를 정규식에 넣을 때는 Python re.escape(), 현대 JavaScript RegExp.escape(), Go regexp.QuoteMeta()를 써. RegExp.escape()가 없는 구형 JavaScript 런타임에서만 검증된 폴리필이 필요해. 사용자 입력을 그대로 문자열로 이어 붙이면 안 돼.

Code

이스케이프 제대로·python
import re

# 리터럴 $19.99 매칭
re.findall(r'\$\d+\.\d{2}', 'price was $19.99 today')
# ['$19.99']

# 원시 문자열 없이 쓰면 문자열 파서가 먼저 백슬래시를 해석해
pattern = "\d+"
print(repr(pattern))  # '\\d+'이지만 잘못된 이스케이프 경고가 날 수 있어

# 사용자 입력은 전용 함수로 이스케이프
user_input = 'price: $19.99'
safe = re.escape(user_input)
print(safe)
# 'price:\\ \\$19\\.99'
re.findall(safe, 'note: price: $19.99 today')

External links

Exercise

https://example.com/path?query=1을 문자 그대로 매칭하도록 특수 문자를 직접 이스케이프한 패턴을 만들어. 같은 문자열에 re.escape()를 적용하고, 직접 만든 패턴과 함수가 만든 패턴이 어떻게 다른지 비교해.

Progress

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

댓글 0

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

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