본문 바로가기
파이썬

파이썬 python-re : 알파벳 문자를 일치시키는 방법

by º기록 2020. 12. 29.
반응형

알파 문자를 정규 표현식과 어떻게 일치시킬 수 있습니까? \ w 에 있지만 \ d 에는없는 문자를 원합니다. 유니 코드와 호환되기를 원하기 때문에 [a-zA-Z] 를 사용할 수 없습니다.

 

해결 방법

 

처음 두 문장이 서로 모순됩니다. "in \ w but is not in \ d "에는 밑줄이 포함됩니다. 세 번째 문장에서 밑줄을 원하지 않는다고 가정하고 있습니다.

봉투 뒷면에 벤 다이어그램을 사용하면 도움이됩니다. 우리가 원하지 않는 것을 살펴 보겠습니다.

(1) \ w 와 일치하지 않는 문자 (즉, 알파, 숫자 또는 밑줄이 아닌 것은 원하지 않음) => \ W
(2) digits => \d
(3) 밑줄 => _

그래서 우리가 원하지 않는 것은 문자 클래스 [\ W \ d _] 에있는 것이기 때문에 우리가 원하는 것은 문자 클래스 [^ \ W \ d _]

다음은 간단한 예입니다 (Python 2.6).

>>> import re
>>> rx = re.compile("[^\W\d_]+", re.UNICODE)
>>> rx.findall(u"abc_def,k9")
[u'abc', u'def', u'k']

추가 탐색을 통해이 접근 방식의 몇 가지 단점을 알 수 있습니다.

>>> import unicodedata as ucd
>>> allsorts =u"\u0473\u0660\u06c9\u24e8\u4e0a\u3020\u3021"
>>> for x in allsorts:
...     print repr(x), ucd.category(x), ucd.name(x)
...
u'\u0473' Ll CYRILLIC SMALL LETTER FITA
u'\u0660' Nd ARABIC-INDIC DIGIT ZERO
u'\u06c9' Lo ARABIC LETTER KIRGHIZ YU
u'\u24e8' So CIRCLED LATIN SMALL LETTER Y
u'\u4e0a' Lo CJK UNIFIED IDEOGRAPH-4E0A
u'\u3020' So POSTAL MARK FACE
u'\u3021' Nl HANGZHOU NUMERAL ONE
>>> rx.findall(allsorts)
[u'\u0473', u'\u06c9', u'\u4e0a', u'\u3021']

U + 3021 (HANGZHOU NUMERAL ONE)은 숫자로 취급되지만 (따라서 \ w와 일치) Python이 "숫자"를 "소수"(범주 Nd)를 의미하는 것으로 해석하여 \ d와 일치하지 않는 것으로 보입니다.

U + 2438 (원형 라틴 소문자 Y)이 \ w와 일치하지 않습니다.

모든 CJK 표의 문자는 "문자"로 분류되므로 \ w와 일치합니다.

위의 3 가지 포인트 중 어느 것이 문제가 되든 아니든, 그 접근 방식은 현재 릴리스 된 re 모듈에서 얻을 수있는 최선의 방법입니다. \ p {letter}와 같은 구문은 미래에 있습니다.

 

참조 페이지 https://stackoverflow.com/questions/2039140

 

 

반응형

댓글