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

선택 — | 연산자

~8 min · alternation, or

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

여러 대안 중 하나를 매칭하기

파이프 문자 |는 대안을 나눠. cat|dogcat 또는 dog를 매칭하고, 대부분의 백트래킹 엔진은 왼쪽 대안부터 시도해.

대안의 순서가 결과를 바꿔

Python, JavaScript, PCRE 같은 엔진은 가장 긴 대안이 아니라 먼저 성공한 대안을 선택해. cat|catscats에 적용하면 cat에서 멈춰. 더 긴 대안을 우선하려면 cats|cat처럼 앞에 둬. POSIX awk의 최장 일치 규칙은 이와 다르니 엔진 방언도 확인해야 해.

주변 문맥이 있다면 대안을 묶어

my cat|dogmy cat 또는 dog를 뜻해. my 뒤에 고양이나 개가 온다는 뜻이라면 my (?:cat|dog)라고 묶어야 해.

한 글자 대안은 문자 클래스가 더 단순해

여러 글자 문자열에는 선택을 쓰고, 한 글자 후보만 나열할 때는 [abcde]처럼 문자 클래스로 표현해. 의도가 분명하고 패턴도 짧아져.

Code

선택 패턴·python
import re

# 단순 OR
re.findall(r'cat|dog', 'I have a cat and a dog')
# ['cat', 'dog']

# 먼저 성공한 대안 — 함정
re.search(r'cat|cats', 'cats').group()
# 'cat'  — 'cats' 아님!
re.search(r'cats|cat', 'cats').group()
# 'cats'  — 순서 중요

# 버그: 선택이 생각보다 더 먹음
re.findall(r'my cat|dog', 'my cat my dog')
# ['my cat', 'dog']  — 두 번째는 그냥 'dog' ('my' 없음)

# 수정: alternation 그룹화
re.findall(r'my (?:cat|dog)', 'my cat my dog')
# ['my cat', 'my dog']

# 한 글자 선택에는 문자 클래스
# 같은 일
re.findall(r'[aeiou]', 'hello')      # ['e', 'o']
re.findall(r'a|e|i|o|u', 'hello')    # ['e', 'o']  — 더 느리고 노이지

External links

Exercise

줄 시작에서 hi, hello, hey, hola 가운데 하나를 찾는 패턴을 작성해. hello there에 적용해 어느 대안이 선택되는지 보고, 대안 순서가 결과에 영향을 준다면 더 긴 문자열을 먼저 두도록 조정해.

Progress

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

댓글 0

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

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