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

Python 원시 문자열 — 왜 r'\d+'

~6 min · python, strings, escape

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

백슬래시는 Python과 정규식에서 두 번 해석될 수 있어

Python 문자열에서 \는 이스케이프 문자라 '\n'은 줄바꿈, '\t'는 탭, '\b'는 코드 포인트 8인 백스페이스가 돼. 정규식 엔진도 \d, \b, \.처럼 백슬래시로 별도 문법을 표현해.

일반 문자열로 정규식의 \d를 전달하려면 '\\d'처럼 Python 문자열 단계에서 백슬래시를 하나 더 써야 해. 두 문법을 한 줄에서 세다 보면 실수하기 쉽지.

정규식 리터럴에는 원시 문자열을 기본으로 써

r'\d+'처럼 앞에 r을 붙이면 Python이 백슬래시를 제어 문자로 바꾸지 않고 정규식 엔진에 전달해. r'\b\w+\b'도 코드에 보이는 경계와 문자 클래스가 그대로 패턴이 돼.

'\b'는 단어 경계가 아니야

re.search('\bword', text)라고 쓰면 정규식 엔진은 단어 경계가 아니라 \x08word를 받아. '\d'처럼 우연히 원하는 두 문자가 남는 경우도 있지만, Python 버전의 경고 동작까지 달라질 수 있으니 그 우연에 기대지 마.

직접 적는 Python 정규식 패턴은 원시 문자열로 쓰는 습관을 들여. 그러면 코드에 보이는 패턴과 엔진이 받는 패턴 사이의 차이를 줄일 수 있어.

동적 값을 넣을 때는 값부터 이스케이프해

변수를 끼우는 패턴은 rf'\b{word}\b'처럼 원시 f-string으로 만들 수 있어. 변수 값 자체를 문자 그대로 찾으려면 rf'\b{re.escape(word)}\b'처럼 re.escape를 적용해.

Code

원시 문자열이 구해줘·python
import re

# 원시 문자열 없이 쓰면 Python이 \b를 백스페이스로 해석
bool(re.search('\bword', 'a word here'))   # False — 의도와 다른 패턴
bool(re.search(r'\bword', 'a word here'))  # True

# 원시 f-string으로 변수 삽입
name = 'pippa'
pattern = rf'\b{name}\b'  # r'\bpippa\b'
bool(re.search(pattern, 'hi pippa'))  # True

# 신뢰하지 않는 입력을 넣을 때는 escape
user_query = 'foo.bar'  # 사용자가 리터럴 문자열 입력
safe = re.escape(user_query)  # 'foo\\.bar'
pattern = rf'\b{safe}\b'
bool(re.search(pattern, 'we found foo.bar in the data'))  # True

# 원시 문자열은 홀수 개의 백슬래시로 끝날 수 없음
# r'\\' OK (백슬래시 2개)
# r'\' SyntaxError
# 해결: '\\'처럼 이스케이프하거나 원시 문자열 뒤에 리터럴을 이어 붙여.

External links

Exercise

Python에서 print('\b')print(r'\b')를 실행해 차이를 확인해. 이어서 원시 문자열이 아닌 '\bcat\b'a cat sat을 검색하고, 단어 경계 대신 백스페이스 문자가 전달되어 실패하는 과정을 설명해.

Progress

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

댓글 0

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

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