2013-04-10 28 views
7

Tên trong biểu mẫu: Ceasar, Julius sẽ được chia thành First_name Julius họ Ceasar.Python 3 regex với dấu phụ và chữ lằn,

Tên có thể chứa dấu (á à é ..), và ligature (æ, ø)

Mã này dường như làm việc OK trong Python 3,3

import re 

def doesmatch(pat, str): 
    try: 
     yup = re.search(pat, str) 
     print('Firstname {0} lastname {1}'.format(yup.group(2), yup.group(1))) 
    except AttributeError: 
     print('no match for {0}'.format(str)) 

s = 'Révèrberë, Harry' 
t = 'Åapö, Renée' 
u = 'C3po, Robby' 
v = 'Mærsk, Efraïm' 
w = 'MacDønald, Ron' 
x = 'Sträßle, Mpopo' 

pat = r'^([^\d\s]+), ([^\d\s]+)' 
# matches any letter, diacritic or ligature, but not digits or punctuation inside the() 

for i in s, t, u, v, w, x: 
    doesmatch(pat, i) 

Tất cả ngoại trừ u phù hợp. (không phù hợp với các con số trong tên), nhưng tôi tự hỏi nếu không có cách nào tốt hơn so với cách tiếp cận không phải không phải chữ số. Quan trọng hơn mặc dù: Tôi muốn tinh chỉnh mô hình để nó từ bỏ vốn từ chữ thường, nhưng bao gồm dấu phụ và chữ cái vốn, tốt nhất là sử dụng regex. Như thể ([A-Z] [a-z] +), sẽ khớp với các ký tự có dấu và kết hợp.

Điều này có khả thi không?

(những gì tôi đã nhìn cho đến nay: Dive into python 3 on UTF-8 vs Unicode; này Regex tutorial trên Unicode (mà tôi không sử dụng), tôi nghĩ rằng tôi không cần new regex nhưng tôi thừa nhận tôi đã không đọc tất cả các tài liệu hướng dẫn của nó)

+0

Tại sao không 'pat = r '^ ([^,] +), (. *) $''? –

+0

@Cristian: điều đó cũng không khớp với 'G @ rd $ tr% m, Joe'? Cho đến thời điểm đó tôi sẽ cần phải phân tích các tên twitter nghệ thuật, tôi không muốn. Chưa. Nhưng, cảm ơn bạn! – RolfBly

Trả lời

3

Nếu bạn muốn phân biệt chữ hoa và chữ thường sử dụng mô-đun re của thư viện chuẩn, thì tôi e rằng bạn sẽ phải xây dựng một lớp nhân vật của tất cả các codepoint Unicode liên quan theo cách thủ công.

Nếu bạn không thực sự cần phải làm điều này, sử dụng

[^\W\d_] 

để phù hợp với bất kỳ thư Unicode. Lớp nhân vật này khớp với bất kỳ thứ gì "không phải là ký tự không phải chữ số" (cũng giống như "ký tự chữ và số") cũng không phải là chữ số và dấu gạch dưới.

+0

Rất cám ơn vì điều này. Tôi đã tự hỏi về [^ \ W] các lớp viết tắt được phủ nhận. Nó nói "có thể được sử dụng trong một lớp học, nhưng điều đó gây nhầm lẫn", trong Regex [Reference] [ref] của Jan Goyvaerts. Tôi nghĩ rằng nó không khó hiểu nhiều hơn chính bản thân mình. [ref] [http://www.regular-expressions.info/reference.html] – RolfBly

+1

Tôi đoán đôi phủ định mất một số nhận được sử dụng để ... –

Các vấn đề liên quan