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

부정형 문자 클래스 [^abc] — 나머지 모두

~6 min · negation, character-class

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

첫 글자의 캐럿은 "아닌 것"을 뜻해

[^abc]a, b, c가 아닌 단일 글자를 매칭해. 문자 클래스 첫 자리에 있는 캐럿 ^가 의미를 뒤집어서 "이것들을 제외한 글자 하나"를 뜻하지.

정규식에서 가장 유용한 도구 가운데 하나야. 따옴표를 만날 때까지 읽으려면 [^"]*, 숫자가 아닌 조각을 건너뛰려면 [^0-9]+, 공백이 아닌 조각을 읽으려면 [^\s]+ 또는 7강에서 배울 \S+를 써.

점과 달리 줄바꿈도 매칭해

여기가 함정이야. [^x]x가 아닌 모든 글자를 매칭하므로 \n도 포함해. DOTALL이 없으면 점 .는 줄바꿈에서 멈추지만 부정형 문자 클래스는 그대로 지나가. 그래서 [^"]*는 여러 줄을 가로지를 수 있어.

그 동작이 필요할 때도 있고 아닐 때도 있어. 여러 줄짜리 따옴표 문자열을 의도했다면 [^"]*가 맞아. 같은 줄 안의 닫는 따옴표까지만 원한다면 [^"\n]*라고 줄바꿈을 따로 제외해.

캐럿은 첫 위치에서만 특별해

[a^b]는 문자 a, 캐럿, b 중 하나를 매칭해. 캐럿은 대괄호 안의 첫 글자일 때만 부정 연산자야.

Code

부정형 문자 클래스 패턴·python
import re

# 따옴표 문자열 본문 매칭
re.findall(r'"([^"]*)"', 'name="Pippa" age="3"')
# ['Pippa', '3']

# 공백 아닌 거 다
re.findall(r'[^\s]+', 'hello world\tand\nfoo')
# ['hello', 'world', 'and', 'foo']

# Negated class 가 줄바꿈 가로지름
re.findall(r'[^x]+', 'abc\ndef\nxyz')
# ['abc\ndef\n']  — \n 기쁘게 포함

# Caret 위치 2+ 는 리터럴
re.findall(r'[a^b]', 'a^b^a')
# ['a', '^', 'b', '^', 'a']

External links

Exercise

부정형 문자 클래스를 사용해 <code>...</code>의 본문을 캡처하는 패턴을 작성해. 같은 작업을 .*?로도 풀고, 두 패턴을 <code>x</code> and <code>y</code>에 적용해 봐. 결과가 같은지와 각 패턴이 어디에서 멈추는지를 적어 봐.

Progress

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

댓글 0

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

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