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

부정과 앵커 — ^는 어디에 있나

~6 min · caret, context, common-bug

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

^는 위치에 따라 뜻이 달라

캐럿은 놓인 자리에 따라 완전히 다른 일을 해. 한 번쯤은 여기서 넘어져.

  • 문자 클래스 밖. ^는 문자열 시작 앵커야.
  • 문자 클래스 안의 첫 글자. ^는 클래스를 부정해.
  • 문자 클래스 안의 나머지 자리. ^는 리터럴 캐럿이야.

^[abc]는 문자열 시작에서 a, b, c 중 하나를 찾아.

[^abc]는 세 글자가 아닌 글자 하나를 어디에서든 찾아.

[a^b]a, 리터럴 캐럿, b 중 하나를 찾아.

어떤 버그를 만들까

가장 흔한 실수는 [^abc]를 의도하고 ^[abc]를 쓰는 거야. 하나는 세 글자를 제외하고, 다른 하나는 문자열 시작에서 세 글자 중 하나를 찾으니 결과가 정반대지.

패턴이 잘못 동작하고 ^가 보인다면 대괄호 안인지 밖인지, 안이라면 첫 자리인지 물어봐.

$는 덜 헷갈려

$는 클래스 밖에서 줄 또는 문자열 끝만 뜻해. 문자 클래스 안에서는 특수하지 않으므로 [a$b]a, 달러 기호, b 중 하나를 매칭해.

Code

캐럿 위치에 따른 차이·python
import re

# 앵커 — 문자열 시작
re.findall(r'^[abc]', 'apple banana')
# ['a'] — 시작의 'a'만 매칭하고 'banana'의 'b'는 시작이 아니야

# 부정형 문자 클래스 — 어디서든 매칭
re.findall(r'[^abc]', 'apple banana')
# ['p', 'p', 'l', 'e', ' ', 'n', 'n'] — a, b, c가 아닌 모든 글자

# 리터럴 캐럿 — 문자 클래스의 첫 위치가 아님
re.findall(r'[a^b]', 'a^b^a')
# ['a', '^', 'b', '^', 'a']

External links

Exercise

'cat dog fish'r'^[cdf]', r'[^cdf]', r'[c^df]'를 각각 적용했을 때의 결과를 실행 전에 적어. 실제 결과와 비교하고, 틀린 예측이 있다면 ^의 위치가 뜻을 어떻게 바꾸는지 설명해.

Progress

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

댓글 0

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

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