Saltar al contenido

¿Cómo eliminar el acento en Python 3.5 y obtener una cadena con unicodedata u otras soluciones?

Solución:

con paquete de terceros: unidecode

3>> unidecode.unidecode("32 rue d'Athènes Paris France")
"32 rue d'Athenes Paris France"

dirección1 = unicodedata.normalize (‘NFKD’, dirección1) .encode (‘utf-8’, ‘ignorar’)

Probablemente quisiste decir .encode('ascii', 'ignore'), para eliminar caracteres que no sean ASCII. UTF-8 contiene todos los caracteres, por lo que la codificación no elimina ninguno, y un ciclo de codificación-decodificación con él no es una operación.

¿Existe una mejor solución?

Depende de lo que estés intentando hacer.

Si solo desea eliminar las marcas diacríticas y no perder todos los demás caracteres no ASCII, puede leer unicodedata.category para cada carácter después de la normalización NFKD y elimine los de la categoría M.

Si desea transliterar a ASCII, eso se convierte en una pregunta específica del idioma que requiere reemplazos personalizados (por ejemplo, en alemán ö se convierte en oe, pero no en sueco).

Si solo desea modificar una cadena en ASCII porque tener caracteres que no son ASCII hace que se rompa algún código, por supuesto es mucho mejor arreglar ese código para que funcione correctamente con todos los caracteres Unicode que manipular datos buenos. La carta è no es codificable en ASCII, pero tampoco el 99,9989% de todos los caracteres, por lo que difícilmente lo hace “especial”. El código que solo admite ASCII es poco convincente.

La API de codificación geográfica de Google puede funcionar perfectamente con Unicode, por lo que no hay ninguna razón obvia por la que deba hacer nada de esto.

ETA:

url2= 'maps.googleapis.com/maps/api/geocode/json?address=" + addresse1 ...

Ah, necesita codificar en URL cualquier dato que inyecte en una URL. Eso no es solo para Unicode, lo anterior también se romperá para muchos símbolos de puntuación ASCII. urllib.quote para codificar una sola cadena, o urllib.encode para convertir múltiples parámetros:

params = dict(
    address=address1.encode('utf-8'),
    key=googlekey
)
url2 = '...?' + urllib.urlencode(params)

(en Python 3 es urllib.parse.quote y urllib.parse.encode y automáticamente eligen UTF-8 para que no tenga que codificar manualmente allí).

data2 = urllib.request.urlopen(url2).read().decode('utf-8')
data3=json.loads(data2)

json.loads lee cadenas de bytes, por lo que debería estar seguro de omitir la decodificación UTF-8. De todas formas json.load leerá directamente de un objeto similar a un archivo, por lo que no debería tener que cargar los datos en una cadena en absoluto:

data3 = json.load(urllib.request.urlopen(url2))

Generalmente, hay dos enfoques: (1) expresiones regulares y (2) str.translate.

1) expresiones regulares

Descomponga la cadena y reemplace los caracteres del bloque Unicode u0300- u036f:

import unicodedata
import re
word = unicodedata.normalize("NFD", word)
word = re.sub("[u0300-u036f]", "", word)

Elimina acentos, circunflejo, diéresis, etc.

pingüino > pinguino
εἴκοσι εἶσι > εικοσι εισι

Para algunos idiomas, podría ser otro bloque, como [u0559-u055f] para la escritura armenia.

2) traducción str.

Primero, cree una tabla de reemplazo (distingue entre mayúsculas y minúsculas) y luego aplíquela.

repl = str.maketrans(
    "áéúíó",
    "aeuio"
)
word.translate(repl)

Los reemplazos de varios caracteres se realizan de la siguiente manera:

repl = {
    ord("æ"): "ae",
    ord("œ"): "oe",
}
word.translate(repl)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *