유니 코드를 사용한 Python 및 정규식


83

문자열 'بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ'에서 일부 유니 코드 기호를 삭제해야합니다.

나는 그들이 여기에 확실히 존재한다는 것을 알고 있습니다. 나는 시도했다 :

re.sub('([\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+)', '', 'بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ')

하지만 작동하지 않습니다. 문자열은 동일하게 유지됩니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변:


110

Python 2.x 또는 3.0을 사용하고 있습니까?

2.x를 사용하는 경우 정규식 문자열을 'u'와 함께 유니 코드 이스케이프 문자열로 만들어보십시오. 정규식이므로 정규식 문자열을 'r'로 원시 문자열로 만드는 것이 좋습니다. 또한 전체 패턴을 괄호로 묶는 것은 불필요합니다.

re.sub(ur'[\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+', '', ...)

http://docs.python.org/tutorial/introduction.html#unicode-strings

편집하다:

유니 코드 정규식에 re.UNICODE / re.U / (? u) 플래그를 사용하는 것도 좋은 방법이지만 \ w 또는 \ b와 같은 문자 클래스 별칭에만 영향을 미치며이 패턴은 아무 것도 사용하지 않으므로 사용하지 않습니다. 영향을받습니다.


15
흠, ur접두사를 모두 연결할 수 있다는 것을 몰랐습니다 . 꽤 괜찮은데!
Balthazar Rouberol 2013 년

6
내가 할 @BalthazarRouberol SyntaxError: invalid syntax 파이썬 3.6
UMAIR Ayub

75

유니 코드 문자열을 사용하십시오 . re.UNICODE 플래그를 사용하십시오 .

>>> myre = re.compile(ur'[\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+', 
                      re.UNICODE)
>>> myre
<_sre.SRE_Pattern object at 0xb20b378>
>>> mystr = u'بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ'
>>> result = myre.sub('', mystr)
>>> len(mystr), len(result)
(38, 22)
>>> print result
بسم الله الرحمن الرحيم

에 의해 기사 읽기 Spolsky 조엘이 라는 긍정적 유니 코드와 문자 집합에 대해 알고 있어야합니다, 물론 절대 최소 모든 소프트웨어 개발자 (변명!)


@nosklo, 문자 수를 설정하는 중괄호 ({5})가 유니 코드 문자와 함께 작동하지 않는 이유는 문제가 있지만 +는 잘 작동합니다. 감사!
securecurve 2013

@securecurve 나는 전혀 모른다. 그리고 내 마법의 수정 구슬 없이는 도울 방법이 없다. 방금 테스트했는데 잘 작동합니다. 작동하지 않는 경우 코드 와 결과를 제공 하여 새로운 질문을하는 것이 좋습니다 .
nosklo

4
re파이썬에서 사용하려면 유니 코드 문자 속성 (예 :)을 지원하지 않는다는 것을 알아야합니다 \p{L}. pypi.python.org/pypi/regex그렇습니다 .
시끄러운

re.UNICODE그것은 단지 속기 문자 클래스에 영향을 받기 때문에 플래그가 여기에 쓸모가 \w, \d, \s.
nhahtdh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.