2012-09-02 5 views
9

Ich bin überrascht, dass ich einen deutschen Umlaut in einer Regexp nicht zuordnen kann. Ich habe mehrere Ansätze ausprobiert, die meisten mit der Einstellung von Locales, aber bisher ohne Erfolg.Umlaute im Regexp-Abgleich (via locale?)

locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8') 
re.findall(r'\w+', 'abc def g\xfci jkl', re.L) 
re.findall(r'\w+', 'abc def g\xc3\xbci jkl', re.L) 
re.findall(r'\w+', 'abc def güi jkl', re.L) 
re.findall(r'\w+', u'abc def güi jkl', re.L) 

Keine dieser Versionen entspricht der Umlaut-u (ü) korrekt mit \w+. Auch das Entfernen des re.L Flags oder das Voranstellen der Musterzeichenfolge mit u (um es Unicode zu machen) hat mir nicht geholfen.

Irgendwelche Ideen? Wie wird die Flagge re.L richtig verwendet?

Antwort

16

Haben Sie versucht, das re.UNICODE Flag zu verwenden, wie in doc beschrieben?

>>> re.findall(r'\w+', 'abc def güi jkl', re.UNICODE) 
['abc', 'def', 'g\xc3\xbci', 'jkl'] 

eine schnelle Suche zeigt auf diese thread, die eine Erklärung gibt:

re.LOCALE geht nur um das Zeichen der zugrunde liegenden C-Bibliothek. Es funktioniert wirklich nur auf Bytestrings, die 1 Byte pro Zeichen haben. UTF-8 codiert Codepunkte außerhalb des ASCII-Bereichs in mehrere Bytes pro Codepunkt, und das erneute Modul behandelt jedes dieser Bytes als separates Zeichen.

+0

Nein, habe ich nicht (mea culpa) mit, ich war nicht bewusst, die Existenz dieser Flagge, und es löst mein Problem! Danke, ich werde dies bald als akzeptierte Antwort kennzeichnen (es sei denn, eine ausführlichere Antwort wird auch erklären, warum meine Versuche, die Locale-Flagge zu verwenden, nicht wie erwartet funktionierten. – Alfe

+0

Bearbeitet, um einen Link zu einem Thread zu geben, der eine Erklärung gibt. –

+0

Wenn Sie Python 2 verwenden, verwenden Sie Unicode-Zeichenfolgen (u "..."). Das Skript UTF-8 ist eine gute Idee. Vergessen Sie die 'LOCALE'-Flagge, denken Sie daran, dass es nur für Legacy-Zeug ist Du hast keine andere Wahl. " – MRAB

0

In meinem Fall \S gab mir bessere Ergebnisse als \w sowie die Datei als UTF-8 zu speichern, sowie re.UNICODE

+1

Vielleicht in Ihren Fällen, aber "\ S" im Allgemeinen passt auch Dinge wie Interpunktion und Sonderzeichen (z. B. ♯ oder → oder ähnlich). Nicht, was ich in meinem Fall brauchte. – Alfe