2013-04-10 11 views
7

Nomi nella forma: Cesare, Giulio devono essere suddivisi in Nome Cognome Giulio.Python 3 regex con segni diacritici e legature,

nomi possono contenere segni diacritici (Â Â E ..), e legature (æ, ø)

Questo codice sembra funzionare bene in 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) 

Tutti tranne u corrispondono. (nessuna corrispondenza per i numeri nei nomi), ma mi chiedo se non esiste un modo migliore rispetto all'approccio non spaziale non numerico. Ancora più importante: mi piacerebbe perfezionare lo schema in modo che distingua maiuscole dalle lettere minuscole, ma compresi i segni diacritici e legature di capitale, preferibilmente usando anche espressioni regolari. Come se ([A-Z] [a-z] +), corrispondesse ai caratteri accentati e combinati.

È possibile?

(quello che ho guardato finora: Dive into python 3 on UTF-8 vs Unicode; Questo Regex tutorial su Unicode (che non sto usando), penso non ho bisogno new regex ma ammetto non ho letto tutta la sua documentazione)

+0

Perché non 'pat = r '^ ([^,] +), (. *) $''? –

+0

@Cristian: non corrisponde anche a "G @ rd $ tr% m, Joe"? Fino a quando non avrò bisogno di analizzare i nomi di fantasia artistici, preferirei di no. Ancora. Ma grazie! – RolfBly

risposta

3

Se si desidera distinguere le lettere maiuscole e minuscole utilizzando il modulo re della libreria standard, allora temo che sarà necessario creare manualmente una classe di caratteri di tutti i codici Unicode pertinenti.

Se non si ha realmente bisogno di fare questo, utilizzare

[^\W\d_] 

per adattarsi a qualsiasi lettera Unicode. Questa classe di caratteri corrisponde a tutto ciò che "non è un carattere non alfanumerico" (che è uguale a "un carattere alfanumerico") che non è una cifra né un trattino basso.

+0

Mille grazie per questo. Mi sono chiesto a proposito di [^ \ W] classi abbreviate. Dice "può essere usato all'interno di una classe, ma questo è fonte di confusione", nel Regex di Jan Goyvaerts [riferimento] [ref]. Penso che non sia molto più confuso della regex stessa. [ref] [http://www.regular-expressions.info/reference.html] – RolfBly

+1

Immagino che la doppia negazione impieghi un po 'ad abituarsi a ... –

Problemi correlati