알파 문자를 정규 표현식과 어떻게 일치시킬 수 있습니까? \ 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
'파이썬' 카테고리의 다른 글
파이썬 열 이름으로 Pandas 데이터 프레임 결합 (0) | 2020.12.29 |
---|---|
파이썬 라벨로 선택하는 Pandas는 때때로 Series를 반환하고 때로는 DataFrame을 반환합니다. (0) | 2020.12.29 |
파이썬 Python 라이브러리 경로에 폴더 추가 (Windows) (0) | 2020.12.29 |
파이썬 Python 2.7에서는 hashlib를 가져 오지만 2.6에서는 가져 오지 않는 오류 (0) | 2020.12.29 |
파이썬에서 프로그램을 어떻게 실행합니까? 경로의 공백으로 인해 os.system이 실패합니다. (0) | 2020.12.29 |
댓글