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

성능과 대안

~8 min · performance, alternatives

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

Lookaround 무료 아냐

각 lookaround 가 모든 관련 위치에서 엔진이 독립적으로 평가하는 sub-pattern. 여러 lookaround 있는 패턴이 등가 캡처-테스트 패턴보다 느릴 수 있음, 특히 긴 입력에.

엔진이 backtrack 해야 할 때

Greedy quantifier 와 결합된 lookaround 가 backtracking 곱할 수 있음. (?=.*X)(?=.*Y).* 가 X 와 Y 를 *거의* 가진 입력에 작업 많이 trigger, 엔진이 각 lookahead 확인 후 메인 패턴 시도.

완화: lookaround 에 anchor. ^(?=.*X)(?=.*Y).*$ 가 적어도 모든 위치 아닌 전체 문자열로 scope 제한.

Lookaround NOT 사용 시기

1. Character class 가 동작할 때. 패턴 시작의 (?=[a-z]) 는 그냥 "소문자 매칭." 소비 NOT 필요 없으면 [a-z] 직접 사용.

2. Two-pass 가 더 명확할 때. 정규식으로 넓게 매칭, 코드에서 필터. Stack 된 lookaround 있는 단일 mega 패턴보다 종종 가독.

3. 엔진이 미지원일 때. Go, RE2, ripgrep 기본. 캡처 사용.

First-pass 테스트

Lookaround 손 뻗기 전에 묻기: "캡처 그룹 + .group(1) 또는 post-processing 으로 풀 수 있나?" 캡처 솔루션이 더 portable, 종종 더 명확. "소비 안 하기" 의 가치가 높을 때 lookaround — split, stacked 룰, sed 친화 패턴.

피파의 실제 코드 lookaround

cwkPippa 코드베이스에서 (?=(?<= 검색. 라우트 매칭, 로그 파싱, Markdown sanitation 에서 발견 — but 캡처 그룹에 ~10:1 비율로 outnumbered. 옳은 도구는 일에 의존.

Code

Lookaround vs 대안·python
import re

# Lookaround 접근 — 대문자 앞 split
re.split(r'(?=[A-Z])', 'CamelCaseString')
# ['', 'Camel', 'Case', 'String']

# 대안: split AND 캡처, 그 다음 재조립
import re
parts = re.findall(r'[A-Z][a-z]*', 'CamelCaseString')
# ['Camel', 'Case', 'String']  — 때론 더 깨끗

# 값 추출 위한 lookaround
import re
re.findall(r'(?<=user_)\w+', 'user_alice user_bob')
# ['alice', 'bob']

# 캡처 그룹 등가 — 때론 portability 위해 선호
m = re.findall(r'user_(\w+)', 'user_alice user_bob')
# ['alice', 'bob']  — 같은 결과, Go/RE2 에서도 동작

# 캡처 버전이 모든 정규식 엔진에서 동작.
# Lookbehind 버전이 Go 에서 컴파일 안 됨.

External links

Exercise

7강의 비밀번호 검증기를 lookaround 없이 다시 작성 — 코드의 캡처-테스트 접근. 두 솔루션 비교: 어느 쪽이 더 짧음? 더 가독? 더 portable? 단일 정답 없음 — but 이제 의견 있어야.

Progress

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

댓글 0

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

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