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

Alternation Scope — | 가 어디까지

~6 min · alternation, scope, precedence

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

Alternation 이 가장 낮은 우선순위

| 연산자는 정규식의 어떤 것보다도 LOOSER 바인딩. 파이프 앞뒤 거가 가능한 만큼 확장 — 보통 가장 가까운 둘러싼 괄호 (또는 전체 패턴 시작/끝) 까지.

그래서 abc|xyz 는 'abc' 또는 'xyz' 의미 — 'abc 뒤 nothing 또는 xyz' 아님.

그리고 a(bc|xy)z 는 'a, 그 다음 bc 또는 xy, 그 다음 z' 의미. 괄호가 alternation 담음.

멀티 분기 alternation

대안 체인 가능: red|green|blue|yellow 가 네 색 중 어느 거든 매칭. 특수 문법 없음 — 그냥 파이프 계속 추가.

5-6개 이상 대안엔 character class 가 동작할지, 또는 대안들이 단일 패턴으로 표현될 공통 모양 가졌는지 고민.

빈 대안

한쪽에 nothing 있는 파이프 — foo| 또는 |foo — 빈 문자열 또는 foo 매칭. Wrap 시 foo? 와 등가: (foo|)(foo)? 와 같음. 일부 엔진은 받음, 일부는 안. 의존하지 마.

Code

Alternation scope·python
import re

# 최상위 alternation — 끝까지 확장
re.search(r'abc|xyz', 'abcxyz').group()
# 'abc'  — 첫 대안 win; 전체 패턴이 'abc' 또는 'xyz'

# 그룹 경계 alternation
re.findall(r'a(bc|xy)z', 'abcz axyz aXz')
# ['bc', 'xy']

# 멀티 분기
re.findall(r'red|green|blue|yellow', 'roses red and violets blue and grass green')
# ['red', 'blue', 'green']

# 흔한 버그: alternation 가로질러 anchor
re.findall(r'^foo|bar$', 'bar foo')
# ['foo']  — '^foo' 또는 'bar$', '^(foo|bar)$' 아님
# 본인이 원했을 거:
re.findall(r'^(?:foo|bar)$', 'foo')
# ['foo']  — 전체 줄 'foo' 또는 'bar' 만 매칭

External links

Exercise

다음 매칭하는 정규식: 'INFO', 'WARN', 'ERROR' 로 시작하는 줄 (anchor). 그룹 없이 패턴이 대부분 케이스 실패. 그룹 있으면 동작. 두 버전 다 보여.

Progress

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

댓글 0

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

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