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

축약 문자 클래스 — \d \w \s

~8 min · shorthand, digit, word, whitespace

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

자주 쓰는 문자 클래스에는 축약형이 있어

\d, \w, \s는 각각 숫자, 단어 문자, 공백 문자를 나타내는 축약 문자 클래스야. ASCII 기준으로 보면 \d[0-9], \w[A-Za-z0-9_]에 가깝지만, 실제 범위는 엔진과 모드에 따라 달라져.

Python, JavaScript, PCRE, Java, .NET, Go, Rust regex 등은 이 문법을 지원해. 반면 POSIX BRE/ERE의 공통 문법은 아니므로, 다른 도구로 패턴을 옮길 때는 지원 여부부터 확인해야 해.

유니코드 처리 방식은 엔진마다 달라

  • Python 3: 기본 모드의 \d, \w, \s는 유니코드를 인식해. ASCII로 제한하려면 re.ASCII를 사용해.
  • JavaScript: 기본 축약 클래스는 ASCII 중심이야. u 플래그만 켠다고 \w가 모든 유니코드 문자를 포함하지는 않으므로, 문자 범주가 필요하면 \p{L} 같은 속성 이스케이프를 함께 사용해.
  • RE2와 Go: \d, \w, \s는 ASCII 의미를 사용해. 유니코드 범주는 \p{Nd}, \pL처럼 따로 적어.
  • ripgrep의 기본 Rust regex 엔진: 유니코드 모드가 기본이라 \w도 유니코드를 인식해. 필요하면 --no-unicode로 제한할 수 있어.
  • PCRE: 기본 축약 클래스는 ASCII 의미야. 유니코드 속성을 적용하려면 (*UCP)PCRE2_UCP가 필요하고, 비 ASCII 코드 포인트를 처리하는 UTF 모드도 따로 확인해야 해.

\w에는 밑줄이 들어가지만 하이픈은 없어

\w+my_var를 한 덩어리로 찾지만 my-var에서는 하이픈 앞뒤가 갈라져. 하이픈까지 허용하려면 의도를 숨기지 말고 [\w-]+처럼 직접 적어.

Code

축약 문자 클래스·python
import re

# 텍스트 안 숫자
re.findall(r'\d+', 'on 2026-05-04 at 14:32')
# ['2026', '05', '04', '14', '32']

# 단어처럼 생긴 토큰
re.findall(r'\w+', 'hello_world! foo-bar 123')
# ['hello_world', 'foo', 'bar', '123'] — '-'에서 foo-bar가 나뉨

# 공백
re.findall(r'\s+', 'a\tb  c\nd')
# ['\t', '  ', '\n']

# Python 3 기본 Unicode 모드: 비 ASCII 숫자도 매칭
re.findall(r'\d+', '٢٠٢٦ 2026')
# ['٢٠٢٦', '2026']

# ASCII로 제한
re.findall(r'\d+', '٢٠٢٦ 2026', re.ASCII)
# ['2026']

External links

Exercise

여러 줄 로그에서 숫자를 모두 추출하는 패턴, 단어 모양의 토큰을 모두 추출하는 패턴, 연속 공백을 경계로 나누는 패턴을 각각 작성해. 각 작업에 유니코드 인식이 필요한지 ASCII로 제한해야 하는지 결정하고 알맞은 플래그를 적용해.

Progress

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

댓글 0

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

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