2010-01-10 2 views
25

알파 문자를 정규식과 어떻게 일치시킬 수 있습니까? \w에있는 문자를 원하지만 \d에없는 문자를 원합니다. 유니 코드 호환이 가능하기 때문에 [a-zA-Z]을 사용할 수 없습니다.python-re : 알파 문자를 일치시키는 방법

+1

"유니 코드 호환"- 그건 당신이 예를 들어, é 전자와 모두 일치 할 것을 의미 하는가? – Seth

+0

파이썬에서 유니 코드 문자열을 표시하려면 다음을 사용해야 함을 기억하십시오. u'Unicode string here '- str.find()를 시도 했습니까? str은 유니 코드 문자열입니다. – Alex

+3

내가 의미하는 바는 내가 a, é, あ, 日 나 그러나 1은 아니 었습니다. (도트), 9, 9 등. 예를 들면. – basaundi

답변

42

첫 번째 두 문장은 서로 모순됩니다. "\w에 있지만 \d에 없음"에는 밑줄이 포함됩니다. 나는 세 번째 문장에서 밑줄을 원하지 않는다고 가정하고 있습니다.

봉투 뒷면에 Venn 다이어그램을 사용하면 도움이됩니다.

(1) (즉, 알파, 숫자 또는 밑줄이 아니다 아무것도하지 않으려는) \w 일치되지 않는 문자 =>\W
(2) 숫자 =의 우리가 원하지 않는 것을 보자 >\d
(3) =>_

그래서 우리가 원하지 않는 어떤 문자 클래스 [\W\d_] 아무것도이고 결과적으로 우리가 원하는 무엇 문자 클래스 다음 [^\W\d_]

에서 아무거나는 간단한 예제 밑줄 (파이썬 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 (항저우 숫자 하나) 숫자로 취급됩니다 (따라서이 w \ 일치)하지만이 나타납니다 "파이썬 해석하는 자리 십진수 "(카테고리의 Nd)"를 의미하는 "그래서 일치하지 않는 \ D

U +

모든 CJK 표의 문자가 분류된다 \ w에 일치하지 않음 2438 (원 라틴어 소문자 Y) "글자"로 일치하므로 \ w

위의 3 가지 사항 중 무엇을 염려하든 상관없이,이 접근법은 현재 출시 된 re 모듈에서 나오는 최선의 방법입니다. 나중에 \ p {letter}와 같은 구문이 사용됩니다.

+0

감사합니다. 당신이 언급 한 단점에도 불구하고 나는 여기서 시작할 수 있고 내가 무엇을 조정할 수 있는지를 생각할 수 있다고 생각합니다. – basaundi

2

무엇에 대해 :

\p{L} 

당신은 참조로이 문서를 사용하기 위해 할 수있는 : Unicode Regular Expressions

편집 :Python doesn't handle Unicode expressions을 보인다. 이 링크로보세요 없습니다 : Handling Accented Characters with Python Regular Expressions -- [A-Z] just isn't good enough (더 이상 활성, 인터넷 아카이브 링크)

또 다른 참조 :


들어 후손, 여기에 블로그의 예 :

import re 
string = 'riché' 
print string 
riché 

richre = re.compile('([A-z]+)') 
match = richre.match(string) 
print match.groups() 
('rich',) 

richre = re.compile('(\w+)',re.LOCALE) 
match = richre.match(string) 
print match.groups() 
('rich',) 

richre = re.compile('([é\w]+)') 
match = richre.match(string) 
print match.groups() 
('rich\xe9',) 

richre = re.compile('([\xe9\w]+)') 
match = richre.match(string) 
print match.groups() 
('rich\xe9',) 

richre = re.compile('([\xe9-\xf8\w]+)') 
match = richre.match(string) 
print match.groups() 
('rich\xe9',) 

string = 'richéñ' 
match = richre.match(string) 
print match.groups() 
('rich\xe9\xf1',) 

richre = re.compile('([\u00E9-\u00F8\w]+)') 
print match.groups() 
('rich\xe9\xf1',) 

matched = match.group(1) 
print matched 
richéñ 
+1

감사합니다.하지만 \ u00E9- \ u00F8과 같은 범위를 지정하면 문자가 (CJK) 구두점 기호 또는 0-9 이외의 숫자 기호임을 알 수 없습니다. – basaundi

+1

http://www.tamasoft.co.jp/en-general-info/unicode.html과 같은 문서를 참조하고 모든 문자 간격을 선택하면 문자 범위로 작업 할 수 있습니다 (지루할 수 있음 ...)); 이 링크는 또한 당신을 도울 수 있습니다 : http://kourge.net/projects/regexp-unicode-block –

+0

예를 들어 여기서 도움이 될 것입니다. –

0

당신은 단일 문자와 일치하도록 다음과 같은 표현 중 하나를 사용할 수 있습니다

(?![\d_])\w 

또는 여기

\w(?<![\d_]) 

내가 \w에 대한 일치하지만, [\d_] 확인은 그 후/이전 일치하지 않습니다 . 워드 프로세서

:

(?!...) 
Matches if ... doesn’t match next. This is a negative lookahead assertion. For example, Isaac (?!Asimov) will match 'Isaac ' only if it’s not followed by 'Asimov'. 

(?<!...) 
Matches if the current position in the string is not preceded by a match for .... This is called a negative lookbehind assertion. Similar to positive lookbehind assertions, the contained pattern must only match strings of some fixed length and shouldn’t contain group references. Patterns which start with negative lookbehind assertions may match at the beginning of the string being searched. 
관련 문제