Acabei de encontrar esta resposta na Web:
import unicodedata
def remove_accents(input_str):
nfkd_form = unicodedata.normalize('NFKD', input_str)
only_ascii = nfkd_form.encode('ASCII', 'ignore')
return only_ascii
Funciona bem (em francês, por exemplo), mas acho que o segundo passo (remover os acentos) poderia ser melhor do que soltar os caracteres não-ASCII, porque isso falhará em alguns idiomas (grego, por exemplo). A melhor solução provavelmente seria remover explicitamente os caracteres unicode marcados como sendo diacríticos.
Edit : isso faz o truque:
import unicodedata
def remove_accents(input_str):
nfkd_form = unicodedata.normalize('NFKD', input_str)
return u"".join([c for c in nfkd_form if not unicodedata.combining(c)])
unicodedata.combining(c)
retornará true se o caractere c
puder ser combinado com o caractere anterior, ou seja, se for um diacrítico.
Edição 2 : remove_accents
espera uma sequência unicode , não uma sequência de bytes. Se você tiver uma cadeia de bytes, decodifique-a em uma cadeia unicode como esta:
encoding = "utf-8" # or iso-8859-15, or cp1252, or whatever encoding you use
byte_string = b"café" # or simply "café" before python 3.
unicode_string = byte_string.decode(encoding)