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

Negative Lookbehind — (?<!...)

~8 min · lookbehind, negative

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

뭔가 앞에 NOT 옴 주장

(?<!...) 는 lookbehind 의 negative: "이 위치에서, 안의 패턴이 앞 텍스트 NOT 매칭." Lookbehind 패턴이 실패할 때만 매칭 성공.

가장 흔한 사용: escape 됐거나 주석 처리된 콘텐츠 참조 스킵

"'DONE-' prefix 안 붙은 모든 TODO 주석 찾기." Negative lookbehind 가 원치 않는 prefix 부재 주장. 없으면 모든 거 매칭하고 코드에서 필터.

실전 예시: 문장 경계 감지

패턴: (?<!Mr|Mrs|Dr)\.\s+[A-Z] — 점 + 공백 + 대문자, 단 title 약자 앞에 안 붙을 때만. 엉성한 문장 경계가 보통 'Mr. Smith said' 를 두 문장으로 처리. Negative lookbehind 가 그거 수정.

Positive lookbehind 와 같은 너비 제약

Python re 가 여기서도 fixed-width 원함. 패턴 (?<!Mr|Mrs|Dr) 는 다른 너비 대안 (2, 3, 2) — Python 내장 re 가 에러 낼 수 있음. 해결책: regex 모듈 설치, OR 같은 너비로 padding, OR positive 매칭 + 나중 필터링으로 재고.

Anchor 와 상호작용

(?<!^) 는 "문자열 시작이 아님" 의미. Anchor 와 결합으로 lookbehind 가 위치 민감 패턴 풀어줌: "이 토큰 찾되 줄 시작은 아님," "시작이 아닌 따옴표 찾기."

Code

Negative lookbehind 패턴·python
import re

# '$' 안 앞에 오는 숫자 (가격 스킵)
re.findall(r'(?<!\$)\d+', 'cost $20 plus 5 shipping and $3 tax')
# ['5']  — '20' 와 '3' 제외, '$' 있으니까

# 'a ' 안 앞에 오는 'cat'
re.findall(r'(?<!a )cat', 'a cat saw a cat and the cat ran')
# ['cat']  — 세 번째만 ('the ' 앞)

# 'DONE-' 안 앞에 오는 'TODO'
re.findall(r'(?<!DONE-)TODO', 'TODO fix this DONE-TODO already done')
# ['TODO']

# 줄 시작이 아닌 숫자 (re.MULTILINE 으로)
re.findall(r'(?<!^)\d+', '5 a 10 b 15', flags=re.MULTILINE)
# ['10', '15']  — '5' 가 줄 시작 (한 줄)

External links

Exercise

소스 코드에서 'fix' 단어 찾되 '// ' 또는 '# ' 앞에 안 붙을 때 (즉 주석 안이 아닐 때) 정규식 작성. 작은 Python 또는 JS 스니펫에 테스트.

Progress

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

댓글 0

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

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