programing

유니 코드 속성과 일치하는 Python 정규식

javaba 2021. 1. 14. 23:03
반응형

유니 코드 속성과 일치하는 Python 정규식


Perl 및 일부 기타 현재 정규식 엔진은 정규식에서 범주와 같은 유니 코드 속성을 지원합니다. 예를 들어 Perl \p{Ll}에서는 임의의 소문자 또는 p{Zs}공백 구분 기호 를 일치시키는 데 사용할 수 있습니다 . 나는 파이썬 2.x 또는 3.x 라인에서 이것에 대한 지원을 보지 못합니다 (정말 후회합니다). 비슷한 효과를 얻을 수있는 좋은 전략을 알고있는 사람이 있습니까? 자체 개발 솔루션을 환영합니다.


당신은 시도 Ponyguruma 의 바인딩 파이썬 Oniguruma 정규 표현식 엔진을? 이 엔진에서는 \p{Armenian}아르메니아 문자와 일치하도록 간단히 말할 수 있습니다 . \p{Ll}또는 \p{Zs}일도.


정규식 모듈 (표준의 대안 re모듈)는 유니 코드 코드 포인트 특성 지원 \p{}구.


각 문자에서 unicodedata를 열심히 사용할 수 있습니다.

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
>>>

여기에 소스가 있습니다. 동일한 데이터를 사용 하는 자바 스크립트 버전 도 있습니다 .


파이썬 정규식 파서가 유니 코드 속성 클래스를 지원하지 않는다는 것이 맞습니다.

당신이 좋은 해킹을하고 싶었다면, 그건 당신이 (예 : 클래스 토큰 문자열을 검색하여 처리기를 만들 수 있습니다, 일반적으로 유용 할 것이다 \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 \ B \ B \ D \ D \ S 및 \ S 유니 코드 문자 속성 데이터베이스에 의존한다." 그리고 \s어떤 간격 문자를 의미한다.

참조 URL : https://stackoverflow.com/questions/1832893/python-regex-matching-unicode-properties

반응형