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

앵커 — ^와 $

~8 min · anchors, start, end, multiline

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

매칭을 위치에 고정하기

앵커는 글자를 소비하지 않고 현재 위치가 특정 경계인지 확인하는 너비 0 검사야.

  • ^ — 문자열 시작이야. MULTILINE 플래그가 있으면 각 줄의 시작도 포함해.
  • $ — 문자열 끝이야. MULTILINE 플래그가 있으면 각 줄의 끝도 포함해.

앵커가 없으면 패턴은 입력 어디에서나 매칭해. ^pattern$은 입력 전체가 이 패턴과 맞아야 한다는 뜻이야.

MULTILINE 플래그

기본적으로 ^$는 전체 문자열의 시작과 끝만 확인해. Python의 re.MULTILINE 또는 PCRE·JavaScript의 m 플래그를 켜면 각 줄의 시작과 끝도 확인하지. 로그 파일이나 여러 줄 사용자 입력을 처리할 때 중요해.

Python에서는 fullmatch로 의도를 드러내

re.fullmatch(pat, text)는 전체 문자열이 패턴과 일치해야 한다는 의도를 API로 직접 표현해. $는 마지막 줄바꿈 직전에도 매칭할 수 있고 문자열로 패턴을 이어 붙이면 선택 범위가 달라질 수 있으므로, ^$를 붙인 패턴과 언제나 같다고 보면 안 돼.

\A와 \Z 앵커

일부 엔진은 MULTILINE의 영향을 받지 않는 별도 앵커를 제공해. \A는 Python, PCRE, .NET에서 절대 문자열 시작을 뜻해. Python의 \Z는 절대 문자열 끝이지만 PCRE와 .NET의 \Z는 마지막 줄바꿈 직전에도 매칭할 수 있어. 그 엔진들에서 절대 끝은 \z야.

Code

앵커 실전·python
import re

# 'foo' 어디든
re.search(r'foo', 'foobar foo').group()  # 'foo'

# 'foo' 가 전체 문자열?
bool(re.fullmatch(r'foo', 'foo'))     # True
bool(re.fullmatch(r'foo', 'foobar'))  # False

# MULTILINE 으로 줄 단위
log = 'line one\nERROR: oops\nline three'
re.findall(r'^ERROR.*$', log, re.MULTILINE)
# ['ERROR: oops']

# MULTILINE 없이 — ERROR 가 맨 시작이어야 매칭
re.findall(r'^ERROR.*$', log)
# []

External links

Exercise

여러 줄 로그를 하나 준비해. 파일 전체가 헤더로 시작하는지, 각 줄 가운데 WARN으로 시작하는 줄이 있는지, 숫자로 끝나는 줄이 있는지를 각각 검사해. 세 경우마다 MULTILINE이 필요한지와 그 이유를 적어.

Progress

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

댓글 0

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

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