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

부정형 전방 탐색 — (?!...)

~8 min · lookahead, negative

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

뒤따르면 안 되는 조건 확인하기

(?!...)는 현재 위치 뒤의 텍스트가 조건과 맞지 않을 때만 성공해. 검사한 문자는 소비하지 않고 본 패턴은 같은 위치에서 계속 진행해.

자주 쓰는 경우

cat(?!s)cat은 찾지만 cats 안의 cat은 제외해. 특정 접미사나 예약어가 뒤따르는 경우를 빼고 싶을 때 같은 방식으로 써.

http(?!s://)https://가 아닌 http만 골라낼 수 있어. 이미 안전한 참조는 건너뛰고 평문 HTTP만 찾는 작업에 맞아.

질문을 뒤집어 봐

무엇을 매칭할지 먼저 묻는 대신 다음에 무엇이 오면 안 되는지 정해. 본 패턴은 원하는 모양을 긍정형으로 설명하고, 예외 하나를 부정형 전방 탐색으로 제외하면 읽기 쉬운 경우가 많아.

탐욕적 수량자와 함께 쓸 때

\w+(?!X)처럼 탐욕적 수량자 뒤에 붙이면 엔진이 문자를 되돌려 주면서 다른 끝점을 시도할 수 있어. 부정 조건만 보지 말고 수량자가 어느 경계까지 소비하는지도 함께 확인해.

Code

부정형 전방 탐색 패턴·python
import re

# 'cat' 인데 'cats' 아님
re.findall(r'\bcat(?!s)\b', 'cats and a cat scatter')
# ['cat']  — 단독 'cat' 만

# 평범한 'http' 인데 'https://' 아님
re.findall(r'http(?!s://)', 'http://a.com https://b.com httpd')
# ['http', 'http']  — 첫 http 와 httpd 안의 'http'

# 'rd' 안 따라오는 숫자 (그래서 '3rd' 아님)
re.findall(r'\b\d+(?!rd\b)', '1st 2nd 3rd 4th 7 11')
# ['1', '2', '4', '7', '11']  — '3' 제외, 'rd' 따라오니까

# 'ing' 안 따라오는 단어
re.findall(r'\b\w+(?!ing)\b', 'run running jump jumping read')
# 주의: \w+ 가 greedy 니까 까다로움 — 패턴 조정 필요

External links

Exercise

testing, tested, tests의 일부가 아닌 독립된 test만 찾는 패턴을 작성해. test the testing tested tests에 적용해서 첫 단어만 매칭되는지 확인해.

Progress

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

댓글 0

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

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