2011-06-10 8 views
5

Tengo dificultades para encontrar un error en mi script Python (2.7). Estoy obteniendo una diferencia con el uso de sub y findall en el reconocimiento de caracteres especiales.Expresiones regulares y Unicode en Python: diferencia entre sub y findall

Aquí está el código:

>>> re.sub(ur"[^-'().,\w]+", '' , u'Castañeda', re.UNICODE) 
u'Castaeda' 
>>> re.findall(ur"[^-'().,\w]+", u'Castañeda', re.UNICODE) 
[] 

Cuando uso findall, correctamente sedes n como un carácter alfabético, pero cuando se utiliza sub Sustituye a esto - tratándolo como un carácter no alfabético.

He podido obtener la funcionalidad correcta utilizando findall con string.replace, pero esto parece una mala solución. Además, quiero usar re.split, y estoy teniendo los mismos problemas que con re.sub.

Gracias de antemano por la ayuda.

+0

¿Qué versión estás usando? Funciona perfectamente en 2.7.1 – viraptor

+0

ActivePython 2.7.1.4 basado en Python 2.7.1. Gracias por informarme que funcionó bien para ti. Puede haber un problema con mi instalación ... Acabo de probarlo en Python 2.6.4, que también está en mi máquina, y estoy obteniendo el mismo problema – user793061

+0

Lo probé desde la consola en ubuntu 11.04. Comenzó con LANG = en_GB.UTF-8, sin entradas de LC. – viraptor

Respuesta

7

La firma llamada de re.sub es:

re.sub(pattern, repl, string, count=0) 

Así

re.sub(ur"[^-'().,\w]+", '' , u'Castañeda', re.UNICODE) 

está fijando count-re.UNICODE, que tiene un valor de 32.

Procurad, más bien:

In [57]: re.sub(ur"(?u)[^-'().,\w]+", '', u'Castañeda') 
Out[57]: u'Casta\xf1eda' 

Colocar (?u) al comienzo de la expresión regular es una forma alternativa de especificar el indicador re.UNICODE en la expresión regular. También puede configurar los otros indicadores (?iLmsux) de esta manera. (Para más información hacer clic this link y busque "(iLmsux)?".)

Del mismo modo, la firma llamado de re.split es:

re.split(pattern, string, maxsplit=0) 

La solución es la misma.

+0

que parece que lo arregló! ¡muchas gracias! – user793061

+0

En caso de que quiera usar una propiedad de carácter unicode (como '\ p {L}'), debe saber que 're' no lo admite. http://pypi.python.org/pypi/regex hace. – noisy

Cuestiones relacionadas