2012-09-02 33 views
9

Me sorprende que no pueda hacer coincidir una diéresis alemana en una expresión regular. Probé varios enfoques, la mayoría relacionados con el establecimiento de configuraciones regionales, pero hasta ahora no sirvieron para nada.Diéresis en correspondencia con expresiones regulares (¿mediante la configuración regional?)

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) 

Ninguna de estas versiones coincide con la diéresis-u (ü) correctamente con \w+. También eliminar la bandera re.L o prefijar la cadena del patrón con u (para hacerlo unicode) no me ayudó.

¿Alguna idea? ¿Cómo se usa correctamente la bandera re.L?

Respuesta

16

¿Ha intentado utilizar el indicador re.UNICODE, como se describe en el doc?

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

Una rápida de los puntos de registro a este thread que da una explicación:

re.LOCALE simplemente pasa el carácter a la biblioteca C subyacente. Es realmente solo funciona en cadenas de bytes que tienen 1 byte por carácter. UTF-8 codifica puntos de código fuera del rango ASCII a múltiples bytes por punto de código, y el módulo re tratará cada uno de esos bytes como un carácter separado .

+0

No, no lo hice (mea culpa), yo no era consciente de la existencia de esa bandera, ¡y resuelve mi problema! Gracias, marcaré esto como la respuesta aceptada pronto (a menos que una respuesta más elaborada también explique por qué mis pruebas con solo usar la bandera de configuración regional no funcionaron como se esperaba. – Alfe

+0

Editado para dar un enlace a un hilo dando alguna explicación. –

+0

Si está usando Python 2, use cadenas Unicode (u "..."). Hacer una secuencia de comandos UTF-8 es una buena idea. Olvídese de la bandera 'LOCALE', piense que es solo para material heredado (cuando no tiene otra opción). – MRAB

0

En mi caso \S me dio mejores resultados que \w, además de guardar el archivo como UTF-8, además de usar re.UNICODE

+1

Quizás en sus casos, pero '\ S' en general también coincide con elementos como signos de puntuación y caracteres especiales (por ejemplo, ♯ o → o similar). No es lo que necesitaba en mi caso. – Alfe

Cuestiones relacionadas