2013-04-10 10 views
7

Namen in der Form: Ceasar, Julius sind in Vorname Julius Nachname Ceasar aufgeteilt werden.Python 3 Regex mit Diakritika und Ligaturen,

Namen enthalten können diakritische Zeichen (á à é ..), und Ligaturen (æ, ø)

Dieser Code scheint 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) 

Alle außer u passen gut zu funktionieren. (Keine Übereinstimmung mit Zahlen in Namen), aber ich frage mich, ob es einen besseren Weg gibt als den Nicht-Ziffern-Nicht-Raum-Ansatz. Wichtiger noch: Ich möchte das Muster so verfeinern, dass es Großbuchstaben von Kleinbuchstaben unterscheidet, aber einschließlich Kapitaldiacritics und Ligaturen, vorzugsweise mit Regex auch. Als ob ([A-Z] [a-z] +), akzentuierte und kombinierte Zeichen zusammenbringen würde.

Ist das möglich?

(was ich bei bisher sah: Dive into python 3 on UTF-8 vs Unicode; Diese Regex tutorial auf Unicode (was ich bin nicht), ich glaube, ich nicht new regex brauche, aber ich gebe zu, ich habe nicht alle seine Dokumentation lesen)

+0

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

+0

@Cristian: würde das nicht auch "G @ rd $ tr% m, Joe" entsprechen? Bis dahin muss ich künstlerische Twitternamen parsen, das möchte ich lieber nicht. Noch. Aber danke! – RolfBly

Antwort

3

Wenn Sie Groß- und Kleinbuchstaben mit dem Modul re der Standardbibliothek unterscheiden möchten, müssen Sie eine Zeichenklasse aller relevanten Unicode-Codepunkte manuell erstellen.

Wenn Sie nicht wirklich brauchen, dies zu tun, verwenden Sie

[^\W\d_] 

jedes Unicode-Buchstaben übereinstimmen. Diese Zeichenklasse entspricht allem, was "kein nicht-alphanumerisches Zeichen" ist (das ist das gleiche wie "ein alphanumerisches Zeichen"), das auch keine Ziffer oder ein Unterstrich ist.

+0

Vielen Dank dafür. Ich habe mich über [^ \ W] negierte Stenografie gekümmert. Es sagt "kann innerhalb einer Klasse verwendet werden, aber das ist verwirrend", in Jan Goyvaerts 'Regex [Referenz] [Ref]. Ich denke, es ist nicht viel verwirrender als Regex selbst. [ref] [http://www.regular-expressions.info/reference.html] – RolfBly

+1

Ich denke, doppelte Negation braucht etwas gewöhnungsbedürftig ... –