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

Zero-Width Assertion 이 뭔데?

~10 min · zero-width, lookaround, fundamentals

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

글자 소비 안 하는 assertion

이미 zero-width assertion 하나 만남: \b, word boundary. "word 와 비-word 사이 경계에 있나?" 체크, 글자 소비 없이. 이게 "zero-width" 의미 — assertion 이 *위치* 의 속성 체크, *글자* 가 아님.

Lookaround 가 이 아이디어의 일반 형태. (?=...) 는 "이 위치에서 따라오는 텍스트가 ... 매칭 — 근데 커서 이동 X" 의미. 엔진이 앞을 엿보고, 매칭 확인, 그 다음 엿보기 *전* 위치에서 계속.

왜 중요

Lookaround 없으면 매칭에 실제 안 원하는 컨텍스트 캡처+소비 해야 해. Lookaround 가 "이 글자 중요해, 근데 주변 때문에만" 표현 가능.

구체: "숫자 + 'kg' 따라오는 거 찾되 숫자만 반환." Lookaround 없이는 'kg' 매칭하고 코드로 떼야. Lookahead 로: \d+(?=kg) 가 숫자 매칭 + 'kg' 따라옴 주장, 매칭은 숫자만.

네 가지 flavor

Lookaround 는 네 변형 — 두 방향 × 두 polarity:

  • (?=...)positive lookahead: "... 가 여기 따라옴"
  • (?!...)negative lookahead: "... 가 여기 NOT 따라옴"
  • (?<=...)positive lookbehind: "... 가 여기 앞에 옴"
  • (?<!...)negative lookbehind: "... 가 여기 앞에 NOT 옴"

각각 다음 강에서.

Code

Zero-width vs 소비·python
import re

# Lookahead 없이 — 매칭에 'kg' 포함
re.findall(r'\d+kg', '5kg of flour, 2kg of sugar')
# ['5kg', '2kg']  — 'kg' 본인이 떼야 함

# Lookahead 로 — 매칭이 숫자만
re.findall(r'\d+(?=kg)', '5kg of flour, 2kg of sugar')
# ['5', '2']

# Word boundary — 원조 zero-width assertion
re.findall(r'\bcat\b', 'cat scatter cats')
# ['cat']  — \b 가 위치 매칭, 글자 아님

External links

Exercise

본인 코드에서 실제 원하는 것보다 더 매칭하고 strip() 또는 슬라이싱으로 다듬는 패턴 잡기. Lookahead/lookbehind 로 다시 작성해서 매칭 자체가 정확히 원하는 거.

Progress

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

댓글 0

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

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