2012-01-01 19 views
9

Eventuali duplicati:
What is the best way to remove accents in a python unicode string?
Python and character normalizationrimozione accento e caratteri speciali

Vorrei rimuovere accenti, girare tutti i caratteri in minuscolo, e cancellare tutti i numeri e caratteri speciali.

Esempio:

Frédér8ic @ -> Frederic

Proposta:

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

Esiste un modo migliore per fare questo?

+0

È possibile modificare la risposta per includere alcuni esempi di input e output desiderati? –

+0

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

+0

Io uso python 3.x – Fred

risposta

14

Una possibile soluzione potrebbe essere

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

Utilizzando NFKD per quanto ne so è il modo standard per normalizzare unicode per convertirlo in caratteri compatibili. Il resto come rimuovere i caratteri speciali numeri e caratteri Unicode che origina dalla normalizzazione, è possibile semplicemente confrontare con string.ascii_letters e rimuovere qualsiasi carattere non in quel set.

+0

molto bene, grazie! – Fred

+2

Ma qual è la variabile stringa in quel comando? Dove si fa riferimento a 'if x in string.ascii_letters' – Falcoa

+0

@Falcoa è rigth. C'è un'altra soluzione def remove_accents (self, data): return unicodedata.normalize ('NFKD', data) .encode ('ASCII', 'ignore') – lesimoes

1

È possibile convertire la stringa in entità HTML? Se è così, puoi usare una semplice espressione regolare.

la seguente sostituzione funzionerebbe in PHP/PCRE (vedi my other answer per un esempio):

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

Poi semplicemente convertire indietro da entità HTML e rimuovere qualsiasi a-Z char non (demo @ CodePad).

Spiacente, non conosco Python abbastanza da fornire una risposta Python.

+1

Non sono sicuro che la regex sia più efficiente di UnicodeData – Fred

+0

@ user1125315: non ne sono sicuro, ma supera correttamente i test di input/output. Sentiti libero di provare altri approcci però, la lib di 'unidecode' sembra fantastica. –