2013-04-10 19 views
7

Imiona w postaci: Ceasar, Julius zostaną podzielone na Imię First Julius Nazwisko Ceasar.Python 3 regex z znakami diakrytycznymi i ligaturami,

Nazwy mogą zawierać znaków diakrytycznych (á A E ..) i ligatury (AE O)

Kod ten wydaje się działać OK w Pythonie 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) 

Wszystkie z wyjątkiem u dopasować. (nie pasuje do liczb w nazwach), ale zastanawiam się, czy nie ma lepszej metody niż niecyfrowe podejście inne niż kosmiczne. Co ważniejsze: Chciałbym zawęzić wzór, aby odróżniał wielkie litery od małych liter, ale w tym kapitalnych znaków diakrytycznych i ligatur, najlepiej używając również regex. Tak jakby ([A-Z] [a-z] +) pasowałoby do znaków akcentowanych i połączonych.

Czy to możliwe?

(co szukałem w tak daleko: Dive into python 3 on UTF-8 vs Unicode; Ten Regex tutorial na Unicode (którego nie używam), myślę, że nie trzeba new regex ale muszę przyznać, że nie czytałem całą swoją dokumentację)

+0

Dlaczego nie 'pat = r '^ ([^,] +), (. *) $''? –

+0

@Cristian: czy to też nie pasuje do "G @ rd $ tr% m, Joe"? Do tego czasu będę musiał parsować artystyczne twitternames, wolałbym nie. Jeszcze. Ale dziękuję! – RolfBly

Odpowiedz

3

Jeśli chcesz odróżnić wielkie i małe litery za pomocą modułu standardowej biblioteki re, to obawiam się, że musisz ręcznie stworzyć klasę znaków wszystkich odpowiednich punktów kodowych Unicode.

Jeśli nie naprawdę trzeba to zrobić, użyj

[^\W\d_] 

dopasować dowolną literę Unicode. Ta klasa znaków pasuje do wszystkiego, co nie jest postacią niealfanumeryczną (która jest taka sama jak "znak alfanumeryczny"), która również nie jest cyfrą ani znakiem podkreślenia.

+0

Wielkie dzięki za to. Zastanawiam się nad [^ \ W] zanegowanymi stenogramami. Mówi "może być użyty wewnątrz klasy, ale to jest mylące", w Regex [Referencja] Jana Goyvaertsa [odniesienie]. Myślę, że nie jest to bardziej mylące niż sam regex. [ref] [http://www.regular-expressions.info/reference.html] – RolfBly

+1

Sądzę, że podwójna negacja wymaga przyzwyczajenia się do ... –