2012-01-01 35 views
9

Duplicar posible:
What is the best way to remove accents in a python unicode string?
Python and character normalizationeliminación de acento y caracteres especiales

me gustaría quitar acentos, convertir todos los caracteres en minúsculas, y borrar los números y caracteres especiales.

Ejemplo:

Frédér8ic @ -> Frederic

Propuesta:

def remove_accents(data): 
    return ''.join(x for x in unicodedata.normalize('NFKD', data) if \ 
    unicodedata.category(x)[0] == 'L').lower() 

¿Hay alguna forma mejor de hacer esto?

+0

¿Podría editar su respuesta para incluir algunos ejemplos de las entradas y salidas deseadas? –

+0

@Christian Jonassen Frédér8ic @ -> frederic @@ àbcd -> abcd% * tréçd -> trecd – Fred

+0

Uso python 3.x – Fred

Respuesta

14

Una posible solución sería

def remove_accents(data): 
    return ''.join(x for x in unicodedata.normalize('NFKD', data) if x in string.ascii_letters).lower() 

Uso NFKD yo sepa es la manera estándar para normalizar Unicode para convertirlo en caracteres compatibles. El resto en cuanto a eliminar los números de caracteres especiales y caracteres unicode que se originaron a partir de la normalización, simplemente puede comparar con string.ascii_letters y eliminar cualquier carácter que no esté en ese conjunto.

+0

muy bien, gracias! – Fred

+2

Pero, ¿cuál es la variable de cadena en ese comando? Donde refiere 'si x en string.ascii_letters' – Falcoa

+0

@Falcoa es correcto. Hay otra solución def remove_accents (self, data): return unicodedata.normalize ('NFKD', data) .encode ('ASCII', 'ignorar') – lesimoes

1

¿Se puede convertir la cadena en entidades HTML? Si es así, puede usar una expresión regular simple.

las sustituciones siguientes funcionaría en PHP/PCRE (ver my other answer para un ejemplo):

'~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i' => '$1' 

después simplemente convertir de vuelta de las entidades HTML y eliminar cualquier a-Z carbón no (demo @ CodePad).

Lo siento, no conozco Python lo suficiente como para proporcionar una respuesta Pythonic.

+1

No estoy seguro de que las expresiones regulares sean más eficientes que UnicodeData – Fred

+0

@ user1125315: tampoco estoy seguro, pero pasa correctamente las pruebas de entrada/salida. No dude en probar otros enfoques, sin embargo, la lib de 'unidecode' parece increíble. –

Cuestiones relacionadas