문자를 나열하는 대신 유니코드 속성 사용하기
\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 범위만 처리하므로 한국어, 키릴 문자, 아랍 문자까지 받아야 한다면 맞지 않아.