C.W.K.
Stream
Lesson 04 of 12 · published

조건 패턴 재방문

~6 min · conditional, pcre

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

단순 if-then-else 너머

트랙 4 가 (?(N)yes|no) 도입. Advanced flavor 가 named-group 조건과 lookaround 조건으로 확장.

Lookaround 조건

PCRE 가 (?(?=lookahead)yes|no) 지원: "lookahead 성공이면 yes, 아니면 no." 소비 없이 "다음 거가 X?" 분기 가능.

Named 조건

(?(name)yes|no) — named 그룹 매칭 여부 기반 분기. 번호와 같은 아이디어, but 편집 가로질러 안정.

재귀-조건 조합

가장 강력 (그리고 가장 저주받은) 사용: 재귀와 조건 결합. "우리 깊이 N 면 이거, 아니면 재귀." 풀 Turing-tarpit 영역.

실제로 필요할 때

Production 코드에 거의 X. 대부분 조건 로직이 alternation, post-processing, 또는 — 진짜 복잡할 때 — 진짜 파서로 더 잘 읽힘.

본 적 있는 한 합법 사용: "X 있으면 Y 도 있어야" 룰 가진 포맷 검증. 조건이 한 정규식에 표현; alternation 이 중복 필요.

Code

Advanced 조건 예시·python
import re

# 트랙 4 와 같지만 named 그룹
pattern = r'(?P<bracket>\()?\d+(?(bracket)\))'
bool(re.fullmatch(pattern, '(42)'))   # True
bool(re.fullmatch(pattern, '42'))     # True
bool(re.fullmatch(pattern, '(42'))    # False

# Lookahead 기반 조건 (PCRE 식, 모든 엔진 동작 X 가능)
# '$' 앞이거나 OR ' USD' 뒤 따라오는 숫자 매칭
# Python 에선 어려움; alternation 이 더 깨끗:
pattern = r'(?:(?<=\$)\d+|\d+(?= USD))'
re.findall(pattern, '$5 and 10 USD and 20')
# ['5', '10']

# 검증: '여는 괄호면 닫아야' — alternation 이 더 깨끗
bool(re.fullmatch(r'\(\d+\)|\d+', '(42)'))  # True
bool(re.fullmatch(r'\(\d+\)|\d+', '42'))    # True
bool(re.fullmatch(r'\(\d+\)|\d+', '(42'))   # False

External links

Exercise

어떤 출처 (PCRE docs, Stack Overflow) 든 조건 정규식 패턴 잡기. 평범한 alternation 으로 다시 작성 시도. 둘 비교: 미래의 본인이 더 빨리 이해할 거?

Progress

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

댓글 0

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

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