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

유니코드 범주 — \p{...}

~10 min · 유니코드, properties

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

문자를 나열하는 대신 유니코드 속성 사용하기

\p{...}는 지정한 유니코드 속성을 가진 문자를 매칭하고, \P{...}는 그 속성이 없는 문자를 매칭해. 문자 범위를 직접 나열하지 않고도 여러 문자 체계를 함께 다룰 수 있어.

자주 쓰는 일반 범주

  • \p{L} — 모든 문자 체계의 글자
  • \p{Ll} — 소문자 글자
  • \p{Lu} — 대문자 글자
  • \p{N} — 십진 숫자, 분수, 로마 숫자처럼 숫자 성격을 가진 문자
  • \p{Nd} — 모든 문자 체계의 십진 숫자
  • \p{P} — 구두점
  • \p{S} — 수학 기호와 통화 기호 같은 기호 문자
  • \p{Z} — 공백을 비롯한 구분 문자
  • \p{Mn} — 결합형 발음 구별 기호 같은 비간격 표시 문자

문자 체계 속성 문법은 엔진마다 달라

예를 들어 JavaScript의 유니코드 모드에서는 \p{Script=Hangul}, PCRE2에서는 \p{sc=Hangul}, Go regexp에서는 \p{Hangul}처럼 작성할 수 있어. 같은 개념이라도 속성 이름과 허용 문법이 다르므로 배포할 엔진의 문서를 확인해.

엔진 지원도 확인해야 해

  • Python 외부 regex 모듈: 유니코드 속성 문법을 지원해.
  • Python 내장 re: \p{...}는 지원하지 않지만 \d, \w, \s가 기본적으로 유니코드를 인식해.
  • JavaScript: /u 또는 /v 플래그가 있는 유니코드 모드에서 속성 이스케이프를 지원해.
  • PCRE2, Java, .NET, Ruby: 각 엔진의 문법으로 지원해.
  • Go regexp: Go가 허용하는 범주와 스크립트 이름으로 지원해.

다국어 텍스트에서 유용해

[\p{L}\p{N}_]+는 여러 문자 체계의 글자와 숫자, 밑줄로 된 토큰을 잡을 수 있어. [a-zA-Z0-9_]+는 ASCII 범위만 처리하므로 한국어, 키릴 문자, 아랍 문자까지 받아야 한다면 맞지 않아.

Code

유니코드 속성 패턴·python
# Python에서는 외부 regex 모듈이 \p{...}를 지원해
import regex

# 모든 문자 체계의 글자
regex.findall(r'\p{L}+', 'hello 안녕 123')
# ['hello', '안녕']

# 한글만
regex.findall(r'\p{Script=Hangul}+', 'hello 안녕 こんにちは')
# ['안녕']

# 한자 문자 체계만
regex.findall(r'\p{Script=Han}+', '中文 한자 漢字')
# ['中文', '漢字'] — '한자'는 한글로 적은 단어야

# 유니코드를 인식하는 토큰 패턴
regex.findall(r'[\p{L}\p{N}_]+', 'var_name = 변수명 + 한글_var')
# ['var_name', '변수명', '한글_var']

# 결합 문자를 제거해 발음 구별 기호 없애기
import unicodedata
clean = regex.sub(r'\p{Mn}', '',
                  unicodedata.normalize('NFD', 'café résumé'))
# 'cafe resume'

# JavaScript에서 같은 한글 속성 사용
# '안녕 hello'.match(/\p{Script=Hangul}+/gu)
# ['안녕']

External links

Exercise

영어, 한국어, 이모지가 섞인 글에 \p{L}+, \p{N}+, \p{Script=Hangul}+을 각각 적용해. ASCII 모드와 유니코드 모드의 \w+ 결과도 함께 비교해서 각 클래스가 포함하는 문자를 기록해.

Progress

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

댓글 0

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

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