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

Negation vs Anchor — ^ 가 무슨 뜻일 때

~6 min · caret, context, common-bug

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

^ 의 완전 다른 두 의미

Caret 은 컨텍스트 따라 두 의미. 모두가 한 번씩 걸려 넘어짐.

  • Character class 밖: ^ 는 start-of-string 앵커.
  • Character class 안, 첫 글자로: ^ 가 클래스 negate.
  • Character class 안, 첫 글자가 아니면: ^ 는 리터럴.

그래서 ^[abc] 는 "문자열 시작, 그 다음 a/b/c."

그리고 [^abc] 는 "a/b/c 가 아닌 어떤 글자든."

그리고 [a^b] 는 "a, 리터럴 caret, 또는 b."

이게 만드는 버그 종류

가장 흔한 버그: [^abc] 의도한 자리에 ^[abc] 작성. 첫 번째는 "문자열 시작에서 a/b/c" — 한 글자만 매칭. 두 번째는 "a/b/c 제외 어떤 글자든" — 어디든.

패턴이 잘못 동작하는 거 디버그할 때 모든 ^ 를 보고 묻기: "대괄호 안인가 밖인가? 첫 위치인가?"

$ 도 같지만 덜 헷갈림

$ 는 한 의미 (line/string 끝) 만. Character class 안에서 절대 특수 안 함. [a$b] 는 그냥 "a, 달러 기호, b." 놀랄 거 없음.

Code

Caret 컨텍스트 버그·python
import re

# 앵커 — 문자열 시작
re.findall(r'^[abc]', 'apple banana')
# ['a']  — 시작의 'a' 만; 'banana' 의 'b' 는 시작 아님

# Negated class — 어디든
re.findall(r'[^abc]', 'apple banana')
# ['p', 'p', 'l', 'e', ' ', 'n', 'n', 'n']  — abc 아닌 모든 글자

# 리터럴 caret — 클래스 안 첫 위치 아님
re.findall(r'[a^b]', 'a^b^a')
# ['a', '^', 'b', '^', 'a']

External links

Exercise

이 세 패턴이 'cat dog fish' 에 대해 출력 예측: (a) r'^[cdf]', (b) r'[^cdf]', (c) r'[c^df]'. 돌리기 전에 예측 *적기*. 점수 매기기.

Progress

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

댓글 0

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

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