Python Regex 일치 유니 코드 특성
-
11-09-2019 - |
문제
Perl 및 기타 현재 Regex 엔진은 범주와 같은 유니 코드 특성을 REGEX에서 지원합니다. 예를 들어 Perl에서 사용할 수 있습니다 \p{Ll}
임의의 소문자 문자와 일치합니다 p{Zs}
공간 분리기의 경우. 나는 2.x 또는 3.x 라인의 파이썬 라인에서 이것에 대한 지원을 보지 못한다 (후회와 함께). 비슷한 효과를 얻는 좋은 전략을 알고 있습니까? 자산 솔루션을 환영합니다.
다른 팁
그만큼 성과선 모듈 (표준 대안 re
모듈)은 유니 코드 코드 포인트 속성을 지원합니다 \p{}
통사론.
각 캐릭터에서 유니 코드 데타를 힘들게 사용할 수 있습니다.
import unicodedata
def strip_accents(x):
return u''.join(c for c in unicodedata.normalize('NFD', x) if unicodedata.category(c) != 'Mn')
잠시 전에 자산 솔루션에 대해 말하면서 나는 작은 것을 썼습니다. 프로그램 그렇게하려면 - 작성된 유니 코드 범주를 변환 \p{...}
유니 코드에서 추출 된 다양한 값으로 사양 (V.5.0.0). 카테고리 만 지원됩니다 (예 : 예 : L
, Zs
), BMP로 제한됩니다. 누군가가 유용하다고 생각할 경우를 대비하여 여기에 게시하고 있습니다 (Oniguruma가 실제로 더 나은 옵션 인 것 같습니다).
예제 사용 :
>>> from unicode_hack import regex
>>> pattern = regex(r'^\\p{Lu}(\\p{L}|\\p{N}|_)*')
>>> print pattern.match(u'疂_1+2').group(0)
疂_1
>>>
여기에 있습니다 원천. 또 한있다 JavaScript 버전, 동일한 데이터를 사용합니다.
당신은 유니 코드 속성 클래스가 Python Regex Parser에 의해 지원되지 않는다는 것입니다.
멋진 해킹을하고 싶다면 일반적으로 유용 할 것입니다. 그러한 클래스 토큰을 위해 문자열을 스캔하는 전처리 서를 만들 수 있습니다 (\p{M}
또는 무엇이든) 해당 문자 세트로 대체하여 예를 들어 \p{M}
될 것입니다 [\u0300–\u036F\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]
, 그리고 \P{M}
될 것입니다 [^\u0300–\u036F\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F]
.
사람들은 당신에게 감사 할 것입니다. :)
그 동안에는 주목하십시오 \p{Ll}
파이썬 정규 표현식에는 동등한 것이 없으며 \p{Zs}
다음으로 덮여 있어야합니다 '(?u)\s'
. 그만큼 (?u)
, 문서가 말한 것처럼, " w, w, b, b, d, d, s 및 s는 유니 코드 문자 속성 데이터베이스에 의존합니다." 그리고 \s
간격을 의미합니다.