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

왜 'Zero-Width'가 중요한가

~6 min · zero-width, engine

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

검사가 끝나도 커서는 같은 자리에 있어

전후방 탐색은 조건을 확인한 뒤에도 엔진의 위치를 움직이지 않아. 이 비소비 성질 때문에 같은 위치에 여러 조건을 겹치거나, 검사에 사용한 문자와 본 매칭이 겹치게 만들 수 있어.

(?=A)(?=B)(?=C)는 같은 시작 위치에서 세 조건이 모두 맞아야 성공해. (?=cat)\w+cat가 시작하는지 먼저 확인한 뒤 \w+가 그 문자들을 실제로 소비해.

문자를 소비하는 패턴과 비교해

cat\d+cat를 소비한 다음 숫자를 찾지만, (?=cat)\d+c 위치에서 바로 숫자를 찾으려 하므로 실패해. (?=cat\d)cat\d+처럼 조건을 확인한 뒤 본 패턴이 같은 텍스트를 소비해야 해.

분할에서 경계 문자를 보존해

re.split(r'(?=[A-Z])', 'CamelCase')는 대문자 앞에서 나누되 대문자를 삭제하지 않아. 전방 탐색이 분할 위치만 찾고 경계 문자를 소비하지 않기 때문이야.

Code

너비 0 검사의 실전 활용·python
import re

# 전방 탐색은 문자를 소비하지 않음 — 같은 위치 여러 조건 연결
re.findall(r'(?=\d)(?=\d{2})\d+', '5 12 345')
# ['12', '345']  — 숫자이며 두 자리 이상

# 전방 탐색이 없으면 첫 숫자를 소비
re.findall(r'\d{2}\d+', '5 12 345')
# ['345']  — 다른 결과; 2 숫자 소비 후 계속

# 구분자를 남기는 분할
re.split(r'(?=[A-Z])', 'CamelCaseString')
# ['', 'Camel', 'Case', 'String']

# 구분자를 소비하는 분할 (전방 탐색 없이)
re.split(r'[A-Z]', 'CamelCaseString')
# ['', 'amel', 'ase', 'tring']  — 대문자 삭제됨

External links

Exercise

전방 탐색과 re.split을 사용해 hello_world_pippa['hello', '_world', '_pippa']로 나눠. 다음 문자가 밑줄인지 확인하는 위치에서 분할하면 밑줄이 뒤 단어에 남는 이유를 설명해.

Progress

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

댓글 0

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

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