본문 바로가기
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

조건 패턴은 캡처 여부 말고 다른 검사도 분기로 쓸 수 있어

트랙 4의 (?(N)yes|no)는 번호 그룹이 참여했는지에 따라 뒤 패턴을 골랐어. 일부 엔진은 이름 붙은 그룹이나 전후방 탐색 결과도 조건으로 사용할 수 있어.

PCRE는 전방 탐색 결과로 분기할 수 있어

(?(?=lookahead)yes|no)는 전방 탐색이 성공하면 yes, 실패하면 no를 적용해. 입력을 소비하지 않고 다음 문자가 특정 모양인지 확인한 뒤 이어질 규칙을 고를 수 있지.

이름 조건은 번호보다 편집에 강해

(?(name)yes|no)는 이름 붙은 그룹이 참여했는지 검사해. 앞쪽에 다른 괄호를 추가해도 이름은 밀리지 않아서 번호 조건보다 의도를 유지하기 쉬워.

재귀와 조건을 합치면 문법은 강해지고 독해는 어려워져

재귀 깊이나 앞선 분기 상태에 따라 다시 재귀할지 결정하는 패턴도 만들 수 있어. 하지만 이런 패턴은 동작을 추적하고 실패 입력을 검증하기가 아주 어려워.

선택이나 코드가 더 잘 읽히는지 먼저 확인해

실제 코드에서는 "X가 있으면 Y도 있어야 한다"처럼 두 분기가 긴 공통 부분을 공유할 때 조건 패턴이 중복을 줄일 수 있어. 그보다 복잡해지면 선택으로 풀거나 매칭 뒤 코드에서 검사하고, 문법 구조를 파싱해야 한다면 전용 파서로 넘겨.

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 문법이라 모든 엔진에서 동작하지 않을 수 있음)
# '$' 앞이거나 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 문서처럼 신뢰할 수 있는 출처에서 조건 패턴 예시 하나를 골라 평범한 선택으로 다시 작성해. 두 표현의 중복, 길이, 엔진 지원 범위를 비교하고 나중에 더 빨리 이해할 수 있는 쪽을 선택해.

Progress

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

댓글 0

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

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