2016-12-17 8 views
0

Warum funktioniert mein regulärer Ausdruck nicht? Ich brauche Python 2.7.5. Das ist mein Ausdruck:Regulärer Ausdruck mit Umlauten in Python 2.7.5

pattern = re.compile('\d{4};[a-zA-ZäöüÄÖÜß. -]+;.+') 

ich eine CSV-Datei zu lesen. Am Anfang muss es 4 Ziffern geben bis eine ;, und bis die 2. ; gibt es Buchstaben von a-Z, Umlaute und . oder ein Leerzeichen oder ., dann nach der 2. ; kann es Zeichen geben.

Jetzt mein Problem: Im zweiten "Teil" akzeptiert es keine Umlaute wie äöü oder ß. Im dritten "Teil", wo ich die Umlaute nicht spezifiziere, ist es kein Problem, wenn sie auftreten.

Ich habe # -*- coding: utf-8 -*- am Anfang des Skripts gesetzt.

Antwort

3

Durch Kodierung UTF-8, eingegeben Sie eine multibyte Sequenz in einer Zeichenklasse:

>>> 'ä' 
'\xc3\xa4' 

Alles, was außerhalb des ASCII-Zeichenbereich mehr als ein Byte erfordert zu kodieren.

Ihre Zeichenklasse entspricht jetzt entweder dem 0xC3-Byte oder einem 0xA4-Byte; Ihre Klasse enthält mehr Bytes und kann passen 'ä' aber es könnte auch jede andere UTF-8-Byte-Sequenz mit den C3- oder A4-Bytes übereinstimmen.

Sie entweder explizit jedes UTF-8-Byte-Paar Übereinstimmen haben würden, um (ein echten Schmerzen), oder Ihre Daten zu Unicode-Strings dekodieren ersten und eine Unicode regulären Ausdruck verwenden:

re.compile(u'\d{4};[a-zA-ZäöüÄÖÜß. -]+;.+', flags=re.UNICODE) 

Pass Hat in Unicode-Text, wenn Sie diesen regulären Ausdruck verwenden

+0

Danke Mann, das hat funktioniert !!! Ich habe seit ein paar Tagen mit diesem Problem zu kämpfen. –

+0

sollte das nicht 'ru' \ d {4} ... ''(für eine Raw-Unicode-String) sein? – thebjorn

+0

@thebjorn: es muss * nicht * sein; Ein Raw-String-Literal ist nur eine andere Syntax für das gleiche Ergebnis. In diesem Fall bleibt "\ d" im resultierenden Wert "\ d". In Python 3 gibt es kein 'ru'-Präfix, also für mehrsprachigen Code (Code, der auf Python 2 und Python laufen muss), so dass ich dieses Präfix nicht verwende. –