2012-01-01 7 views
9

Powiel możliwe:
What is the best way to remove accents in a python unicode string?
Python and character normalizationusuwania akcent i znaki specjalne

Chciałbym usunąć akcenty, włączyć wszystkie znaki na małe i usuwać żadnych cyfr i znaków specjalnych.

Przykład:

Frédér8ic @ -> Frederic

Wniosek:

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

Czy istnieje lepszy sposób to zrobić?

+0

Czy możesz edytować swoją odpowiedź, aby podać przykłady pożądanych danych wejściowych i wyjściowych? –

+0

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

+0

Używam python 3.x – Fred

Odpowiedz

14

Możliwym rozwiązaniem byłoby

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

Korzystanie NFKD AFAIK to standardowy sposób do normalizacji Unicode, aby przekształcić go do zgodnych znaków. Reszta, aby usunąć znaki specjalne i znaki Unicode pochodzące z normalizacji, można po prostu porównać z string.ascii_letters i usunąć wszystkie znaki spoza tego zestawu.

+0

bardzo dobrze, dzięki! – Fred

+2

Ale jaka jest zmienna łańcuchowa w tym poleceniu? Gdzie odsyłasz 'if x in string.ascii_letters' – Falcoa

+0

@Falcoa jest prawdą. Istnieje inne rozwiązanie: def remove_accents (self, data): return unicodedata.normalize ('NFKD', data) .encode ('ASCII', 'ignore') – lesimoes

1

Czy można przekształcić ciąg w elementy HTML? Jeśli tak, możesz użyć prostego wyrażenia regularnego.

Poniższa wymiana będzie działać w PHP/PCRE (patrz my other answer dla przykładu):

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

Następnie wystarczy przekształcić z powrotem od podmiotów HTML i usunąć non a-Z Char (demo @ CodePad).

Niestety, nie znam Pythona na tyle, aby podać odpowiedź w języku Python.

+1

Nie jestem pewien, że regex są bardziej wydajne niż UnicodeData – Fred

+0

@ user1125315: Również nie jestem pewien, ale poprawnie przechodzi twoje testy wejścia/wyjścia. Możesz spróbować wypróbować inne metody, ale lib 'unidecode' wydaje się być niesamowity. –