2011-06-10 5 views
5

Python (2.7) 스크립트에서 버그를 찾아내는 데 어려움을 겪고 있습니다. 특수 문자를 인식 할 때 sub 및 findall을 사용하는 것과 다른 점이 있습니다. 여기 Python의 정규 표현식과 유니 코드 : sub와 findall의 차이점

코드입니다 :
>>> re.sub(ur"[^-'().,\w]+", '' , u'Castañeda', re.UNICODE) 
u'Castaeda' 
>>> re.findall(ur"[^-'().,\w]+", u'Castañeda', re.UNICODE) 
[] 

내가 findall은 사용

가 올바르게 알파벳 문자로 N 본다,하지만 난 서브를 사용할 때이 대체 - 알파벳이 아닌 문자로 치료.

findall을 string.replace와 함께 사용하여 올바른 기능을 얻을 수 있었지만이 방법이 좋지 않은 것 같습니다. 또한 re.split을 사용하고 싶습니다. re.sub와 동일한 문제가 있습니다.

도움을 미리 감사드립니다.

+0

어떤 버전을 사용하고 있습니까? 그것은 2.7.1에서 잘 작동합니다 – viraptor

+0

ActivePython 2.7.1.4는 Python 2.7.1을 기반으로합니다. 저에게 잘 돌아 갔음을 알려 주셔서 감사합니다. 내 설치에 문제가있을 수 있습니다 ... 난 그냥 내 컴퓨터에있는 파이썬 2.6.4에서 그것을 시도하고 동일한 문제가 생기고 있어요 – user793061

+0

우분투 11.04에서 콘솔에서 테스트했습니다. LANG = en_GB.UTF-8, LC 항목 없음으로 시작되었습니다. – viraptor

답변

7

re.sub의 호출 서명은 다음과 같습니다

In [57]: re.sub(ur"(?u)[^-'().,\w]+", '', u'Castañeda') 
Out[57]: u'Casta\xf1eda' 
: 그래서

re.sub(ur"[^-'().,\w]+", '' , u'Castañeda', re.UNICODE) 

대신 시도 값을 32

있다 re.UNICODE-count을 설정하는 것입니다

re.sub(pattern, repl, string, count=0) 

(?u)을 정규식의 시작 부분에 배치하는 것은 정규식 자체에서 re.UNICODE 플래그를 지정하는 다른 방법입니다. 다른 플래그를 (?iLmsux)으로 설정할 수도 있습니다. ("(iLmsux를)?"더 많은 정보 this link을 클릭하고 검색 할 수 있습니다.)

마찬가지로, re.split의 호출 서명은 다음과 같습니다

re.split(pattern, string, maxsplit=0) 

이 솔루션은 동일합니다.

+0

마치 고정 된 모양입니다. 정말 고마워! – user793061

+0

유니 코드 문자 속성 (예 :'\ ​​p {L}')을 사용하려면're'가 지원하지 않는다는 것을 알아야합니다. http://pypi.python.org/pypi/regex는 않습니다. – noisy

관련 문제