Ignorar acentos al comparar cadenas de texto y diferencias entre mayúsculas o minúsculas

Publicado el 12 febrero 2020 por Daniel Rodríguez @analyticslane

En Python es relativamente fácil comparar si dos cadenas de caracteres son iguales, solamente se tiene que utilizar el operador comparación (==). Pero esta forma de comparar diferencia entre mayúsculas y minúsculas, cosa que en muchos casos no es lo que se quiere. También nos podemos encontrar con el problema de espacios en blanco introducidos accidentalmente. Además de estos, otro problema adicional que nos podemos encontrar a la hora de comparar cadenas de texto es la existencia de acentos. Algunos usuarios pueden que accedan con teclados que no permiten escribirlos, o por lo menos de una forma fácil, lo que hace que se puedan emitir. Hoy vamos a ver tanto como se pueden ignorar los acentos al comparar cadenas de texto, eliminar espacios y la diferencias entre mayúsculas o minúsculas.

Ignorar diferencias entre mayúsculas o minúsculas a la hora de comparar

Posiblemente la tarea más sencilla sea comparar dos cadenas de texto sin tener en cuenta la diferencia entre mayúsculas o minúsculas. Python no tiene una función que permite esto, pero las cadenas de texto si que tienen métodos que pueden convertir una cadena en mayúsculas ( upper) o minúsculas ( lower). Así que, si convertimos las dos cadenas de texto que deseamos comparar a minúsculas, o mayúsculas, se puede obtener el efecto deseado. Algo que se puede ver en el siguiente ejemplo:

string_1 = "hola"
string_2 = "Hola"

string_1 == string_2                 # False
string_1.lower() == string_2.lower() # True
string_1.upper() == string_2.upper() # True

Ignorar espacios en blanco

Si existiesen espacios en blanco en la cadena de texto se pueden eliminar con el método strip. Eliminando tanto los que aparecen antes como después de las cadenas. Así, para evitar el problema de los espacios en blanco se puede hacer lo mismo que con la diferenciación entre mayúsculas y minúsculas. Aplicar el método antes de realizar la comparación como se muestra en el siguiente ejemplo:

string_1 = "Hola"
string_2 = "Hola "

string_1 == string_2                 # False
string_1.strip() == string_2.strip() # True

Ignorar acentos

En el caso de lo acentos en más complejo que los dos anteriores. Python no dispone una función nativa para tratar los acentos, pero se puede usar el paquete unicodedata. En este se encuentra la función normalize que devuelve la forma normalizada de una cadena Unicode, es decir, la forma sin acentos o signos diacríticos. Lo que se puede conseguir con el siguiente ejemplo:

import unicodedata

string_1 = 'función'

unicodedata.normalize('NFKD', string_1).encode('ASCII', 'ignore') # función

Siendo NFKD una de las formas de normalización existentes en Unicode.

Hay que tener en cuenta que esta función también convierte la ñ y ç en n y c respectivamente. Cosa que podría no ser lo deseado en algunos casos.

unicodedata.normalize('NFKD', "Peña").encode('ASCII', 'ignore') # Pena

Combinar lo visto para comparar cadenas de texto

Todo lo que se ha visto se puede combinar para comparar cadenas de texto. Por ejemplo, se puede ver como la síguete línea compara dos cadenas con todos los casos vistos.

import unicodedata

string_1 = 'función'
string_2 = "Función "

unicodedata.normalize('NFKD', string_1).encode('ASCII', 'ignore').strip().lower() == unicodedata.normalize('NFKD', string_2).encode('ASCII', 'ignore').strip().lower()

Conclusiones

En esta entrada se ha visto cómo ignorar acentos al comparar cadenas de texto además de espacios en blanco y no diferenciar entre mayúsculas o minúsculas. Algo que puede ser útil cuando necesitamos comparar texto que ha sido introducido por un usuario y puede contener errores.

Imagen de cocoparisienne en Pixabay

Publicidad

Publicidad