본문 바로가기
C.W.K.
Stream
Lesson 06 of 12 · published

선택 범위 — |가 어디까지

~6 min · alternation, scope, precedence

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

선택 연산자의 범위는 넓어

|는 우선순위가 낮아서 양쪽 표현을 가장 가까운 그룹 경계나 패턴 끝까지 대안으로 묶어. 범위를 눈으로 확인하기 어렵다면 비캡처 그룹으로 의도를 드러내.

abc|xyzabc 전체 또는 xyz 전체를 뜻해. 반면 a(bc|xy)z는 앞의 a와 뒤의 z를 공통으로 두고 가운데 대안을 캡처해.

여러 대안 이어 쓰기

red|green|blue|yellow처럼 파이프를 이어 네 단어 중 하나를 매칭할 수 있어. 대안이 한 글자씩이라면 문자 클래스가 더 간결한지, 공통 접두사나 접미사가 있다면 그룹 밖으로 뺄 수 있는지 살펴봐.

앵커와 함께 쓸 때는 그룹이 중요해

^foo|bar$^foo 또는 bar$로 해석돼. 전체 문자열이 foobar인지 검사하려면 ^(?:foo|bar)$처럼 대안을 먼저 묶어야 해.

빈 대안과 선택 수량자는 결과가 다를 수 있어

(?:foo|)(?:foo)?는 같은 문자열 집합을 매칭하지만, 캡처 그룹을 사용하면 빈 대안은 빈 문자열을 캡처하고 선택 그룹은 아예 참여하지 않을 수 있어. 단순히 조각 하나가 선택 사항이라면 (?:foo)?가 의도를 더 잘 보여 줘.

Code

선택 범위·python
import re

# 최상위 선택은 패턴 끝까지 확장
re.search(r'abc|xyz', 'abcxyz').group()
# 'abc' — 첫 번째 대안이 성공해

# 그룹 안에서 가운데 조각만 선택
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']

# 흔한 버그: 앵커가 각 대안에 따로 붙어
re.findall(r'^foo|bar$', 'bar foo')
# [] — '^foo'는 시작에서, 'bar$'는 끝에서만 확인해

# 의도한 전체 문자열 검증
re.findall(r'^(?:foo|bar)$', 'foo')
# ['foo'] — 전체 문자열이 'foo' 또는 'bar'일 때만 매칭해

External links

Exercise

INFO, WARN, ERROR 중 하나로 시작하는 줄을 매칭하는 패턴을 작성해. 대안을 그룹으로 묶지 않은 버전과 묶은 버전을 모두 실행하고, ^가 각각 어느 범위에 적용되는지 설명해.

Progress

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

댓글 0

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

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