Solución al Ejercicio: Normalizar texto
📋 Copiar código
def normalizar_texto_es(texto):
texto = texto.lower()
acentos = {
'á': 'a', 'é': 'e', 'í': 'i',
'ó': 'o', 'ú': 'u', 'ü': 'u',
'ñ': 'n',
'Á': 'a', 'É': 'e', 'Í': 'i',
'Ó': 'o', 'Ú': 'u', 'Ü': 'u',
'Ñ': 'n'
}
return ''.join(acentos.get(c, c) for c in texto)
# Pruebas
textos = [
"Hola, ¿Cómo Estás?",
"Mañana Iré Al Centro.",
"ÁÉÍÓÚÜÑáéíóúüñ",
"Texto sin acentos.",
"",
"Palabra con diéresis: pingüino"
]
for texto in textos:
print(f"'{texto}' -> '{normalizar_texto_es(texto)}'")
Explicación del Código:
-
Importa el módulo unicodedata
:
Este módulo proporciona acceso a la base de datos de caracteres Unicode.
-
Función
normalizar_texto_es(texto)
:
texto = texto.lower()
:
Convierte toda la cadena de texto a minúsculas.
texto_sin_acentos = ''.join((c for
c in unicodedata.normalize('NFD', texto) if unicodedata.category(c) != 'Mn'))
:
Realiza la eliminación de acentos:
unicodedata.normalize('NFD',
texto)
: Aplica la normalización Unicode NFD (Normalization
Form Decomposition). Esto descompone los caracteres acentuados en su
carácter base y un carácter de "marca" que representa el acento. Por
ejemplo, 'á' se convierte en 'a' seguido de una marca de acento.
(c for c in ... if
unicodedata.category(c) != 'Mn')
: Itera a través de los
caracteres resultantes de la descomposición y filtra aquellos cuya
categoría Unicode (unicodedata.category(c)
) no sea 'Mn'
(Mark, Nonspacing). Las marcas de acento tienen esta categoría, por
lo que se eliminan.
''.join(...)
: Une los
caracteres filtrados para formar la cadena sin acentos.
- Devuelve la cadena normalizada.
Ejemplos de Uso:
Los ejemplos muestran cómo la función convierte
diferentes cadenas de texto en español a minúsculas y elimina los acentos,
incluyendo vocales acentuadas, la letra 'ñ' y la diéresis en la 'ü'.
Este tipo de normalización es muy útil para
realizar búsquedas o comparaciones de texto donde no quieres que las variaciones
de acentos o mayúsculas/minúsculas afecten los resultados.