Expresiones regulares y Unicode en Python: diferencia entre sub y findall

Estoy teniendo dificultades para tratar de resolver un error en mi script Python (2.7). Estoy obteniendo una diferencia con el uso de sub y findall para reconocer caracteres especiales.

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, ve correctamente ñ como un carácter alfabético, pero cuando utilizo sub lo reemplaza – tratándolo como un carácter no alfabético.

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

Gracias de antemano por la ayuda.

La firma de llamada de re.sub es:

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

Asi que

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

está configurando count para re.UNICODE , que tiene un valor de 32.

Intenta en su lugar:

 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 establecer las otras banderas (?iLmsux) esta manera. (Para obtener más información, haga clic en este enlace y busque “(? ILmsux)”.)

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

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

La solución es la misma.