2010-01-10 24 views
25

Làm cách nào để khớp một ký tự alpha với cụm từ thông dụng. Tôi muốn có một ký tự ở số \w nhưng không có trong \d. Tôi muốn nó tương thích unicode đó là lý do tại sao tôi không thể sử dụng [a-zA-Z].python-re: Làm cách nào để khớp một ký tự alpha

+1

"unicode tương thích" - Điều đó có nghĩa rằng bạn muốn kết hợp cả e và é, ví dụ? – Seth

+0

Trong Python, hãy nhớ rằng để chỉ ra một chuỗi unicode bạn phải sử dụng: chuỗi u'Unicode ở đây '- cho rằng bạn đã thử str.find() trong đó str là chuỗi unicode của bạn? – Alex

+3

Điều tôi muốn nói là tôi muốn kết hợp một, é, あ, 日 나 nhưng không phải 1,. (ví dụ: chấm), 9, 9,。, v.v. . – basaundi

Trả lời

42

Hai câu đầu tiên của bạn mâu thuẫn với nhau. "in \w nhưng không có trong \d" bao gồm dấu gạch dưới. Tôi giả định từ câu thứ ba của bạn rằng bạn không muốn gạch dưới.

Sử dụng biểu đồ Venn ở mặt sau của phong bì sẽ giúp. Chúng ta hãy nhìn vào những gì chúng tôi KHÔNG muốn:

(1) ký tự không được kết hợp bởi \w (tức là không muốn bất cứ điều gì đó không phải là alpha, chữ số, hoặc dấu gạch dưới) =>\W
(2) chữ số = >\d
(3) gạch =>_

Vì vậy, những gì chúng tôi không muốn bất cứ điều gì trong lớp nhân vật [\W\d_] và hậu quả là những gì chúng ta làm muốn là bất cứ điều gì trong lớp nhân vật [^\W\d_]

Dưới đây là một ví dụ đơn giản (Python 2.6).

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

thăm dò sâu hơn cho thấy một vài quirks của phương pháp này:

>>> 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 số ONE) được coi là số (do đó nó phù hợp với \ w) nhưng có vẻ như Python diễn giải " chữ số" có nghĩa là "chữ số thập phân"(loại Nd) vì vậy nó không phù hợp với \ d

U + 2438 (vòng LATIN THƯ NHỎ Y) không khớp với \ w

chữ Hán

Tất cả CJK được phân loại dưới dạng "chữ cái" và do đó khớp \ w

Cho dù bất kỳ điểm nào trong số 3 điểm trên đều là mối lo ngại hay không, cách tiếp cận đó là tốt nhất bạn sẽ thoát khỏi mô-đun đang được phát hành hiện tại. Cú pháp như \ p {letter} là trong tương lai.

+0

Cảm ơn bạn! Mặc dù những điều kỳ quặc bạn đề cập đến tôi nghĩ rằng tôi có thể bắt đầu từ đây và xem những gì tôi có thể điều chỉnh. – basaundi

2

gì về:

\p{L} 

Bạn có thể sử dụng tài liệu này như tài liệu tham khảo: Unicode Regular Expressions

EDIT: vẻ Python doesn't handle Unicode expressions. Hãy xem vào liên kết này: Handling Accented Characters with Python Regular Expressions -- [A-Z] just isn't good enough (không còn hoạt động, liên kết để lưu trữ internet)

tài liệu tham khảo khác:


Đối hậu thế, đây là những ví dụ trên blog:

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

Cảm ơn bạn nhưng tôi không thể biết thời tiết một ký tự là biểu tượng dấu chấm câu (CJK) hoặc ký hiệu số không phải là 0-9 nếu tôi thực hiện một phạm vi như \ u00E9- \ u00F8. – basaundi

+1

bạn có thể làm việc với các phạm vi chữ, nếu bạn tham khảo một tài liệu như http://www.tamasoft.co.jp/en/general-info/unicode.html và để chọn tất cả các khoảng chữ cái (có thể là nhàm chán ...); liên kết này cũng có thể giúp bạn: http://kourge.net/projects/regexp-unicode-block –

+0

Một ví dụ về hành động này sẽ hữu ích ở đây. –

0

Bạn có thể sử dụng một trong các khái niệm sau để phù hợp với một chữ cái:

(?![\d_])\w 

hoặc

\w(?<![\d_]) 

Ở đây tôi phù hợp cho \w, nhưng kiểm tra rằng [\d_] không được xuất hiện trước/sau đó .

Từ các tài liệu:

(?!...) 
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. 
Các vấn đề liên quan