2012-09-02 10 views
9

Sono sorpreso di non essere in grado di associare un'umlaut tedesca a un'espressione regolare. Ho provato diversi approcci, la maggior parte coinvolgendo impostazioni locali, ma fino ad ora senza successo.Umlauts in corrispondenza di espressioni regolari (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) 

Nessuna di queste versioni corrisponda al dieresi-u (u) correttamente con \w+. Anche la rimozione del flag re.L o il prefisso della stringa del modello con u (per renderlo unicode) non mi ha aiutato.

Qualche idea? Come viene utilizzata correttamente la bandiera re.L?

risposta

16

Hai provato a utilizzare il flag re.UNICODE come descritto nello doc?

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

A rapidi punti ricerca a questo thread che dà qualche spiegazione:

re.LOCALE passa proprio il carattere alla libreria C sottostante. It funziona davvero solo con i bytestring che hanno 1 byte per carattere. UTF-8 codifica i punti al di fuori dell'intervallo ASCII a più byte per codepoint e il modulo re considera ciascuno di questi byte come un carattere separato .

+0

No, non l'ho fatto (mea culpa), non ero a conoscenza del esistenza di quella bandiera, e risolve il mio problema! Grazie, la contrassegnerò come risposta accettata al più presto (a meno che una risposta più elaborata spieghi anche perché le mie prove utilizzando solo la bandiera locale non funzionassero come previsto. – Alfe

+0

Modificato per fornire un collegamento a una discussione fornendo alcune spiegazioni. –

+0

Se stai usando Python 2, usa le stringhe Unicode (u "..."). Creare lo script UTF-8 è una buona idea. Dimentica il flag 'LOCALE', pensa che sia solo per le cose legacy (quando non hai altra scelta) – MRAB

0

Nel mio caso \S mi ha dato risultati migliori rispetto \w, oltre a salvare il file come UTF-8, più utilizzando re.UNICODE

+1

Forse nei tuoi casi, ma '\ S' in generale corrisponde anche a punteggiatura e caratteri speciali (per esempio ♯ o → o simili). Non è quello che mi serviva nel mio caso. – Alfe

Problemi correlati