Convertir cadenas a minúsculas en Python

En esta guía, aprenda cómo convertir una cadena a minúsculas en Python, con str.lower() y str.casefold(), a través de ejemplos prácticos de código y explicaciones detalladas para principiantes.

Introducción

Convertir texto en un caso uniforme es un buen punto de partida de cualquier tipo para el procesamiento de texto.

En este artículo, le mostraremos cómo convertir texto a minúsculas utilizando uno de los métodos integrados de Python que se utilizan para manipular cadenas: str.lower().

Desde una vista de alto nivel, el proceso se logra a través de:

1
2
3
exampleString = "[correo electrónico protegido]$"
lowercaseString = exampleString.lower()
print(lowercaseString) # [correo electrónico protegido]$

Sin embargo, y especialmente si eres nuevo en Python, sigue leyendo. Discutiremos un enfoque alternativo para convertir cadenas a minúsculas, para que tenga una visión general completa del tema. Después de leer el artículo, podrá convertir cualquier cadena a minúsculas, saber cuándo simplemente usar el método str.lower() y cuándo elegir el enfoque alternativo en su lugar.

Cómo convertir cadenas a minúsculas en Python

Convertir cadenas a minúsculas es bastante sencillo de realizar en Python. str.lower() es el método incorporado hecho específicamente para ese propósito. Se define como un método del tipo String que está integrado en el espacio de nombres de Python.

{.icon aria-hidden=“true”}

Nota: Cada tipo integrado de Python tiene un conjunto de métodos diseñados para realizar operaciones en ese tipo específico. Por ejemplo, el tipo String tiene métodos predefinidos para eliminar espacios en blanco iniciales y finales, buscar y reemplazar subcadenas, dividir cadenas en matrices, etc. Uno de esos métodos es str.lower().
Cada método definido para el tipo String tiene el prefijo str junto a su nombre en la documentación. Eso sugiere que todos ellos se llaman en instancias de cadena.

El método str.lower() devuelve una copia en minúsculas de la cadena en la que se llama. Eso puede ser útil cuando desea guardar la cadena original para su uso posterior. Ahora, veamos cómo convertir una cadena a minúsculas en Python.

Supongamos que tiene alguna cadena que desea convertir:

1
exampleString = "[correo electrónico protegido]$"

Como puede ver, esta cadena tiene letras mayúsculas y minúsculas, así como algunos caracteres especiales. Solo las letras se pueden convertir a minúsculas, por lo que esperaría que la versión en minúsculas de esta cadena fuera "[correo electrónico protegido]$":

1
2
lowercaseString = exampleString.lower()
print(lowercaseString) # [correo electrónico protegido]$

Después de llamar al método str.lower() en exampleString, su copia en minúsculas se almacena como un nuevo objeto, al que hace referencia lowercaseString. Solo para asegurarnos de que el método str.lower() produzca la salida correcta, comparemos lowercaseString con la versión en minúsculas esperada de exampleString:

1
2
3
4
if(lowercaseString == "[correo electrónico protegido]$"):
    print("Lowercase string EQUAL to expected string!")
else:
    print("Lowercase string NOT EQUAL to expected string!")

Este fragmento de código generará:

1
"Lowercase string EQUAL to expected string!"

¡Impresionante!

{.icon aria-hidden=“true”}

Nota: El método opuesto al método str.lower() es str.upper(). Se usa de la misma manera que str.lower(). Además, puede verificar si una cadena está en minúsculas o en mayúsculas usando str.islower() o str.isupper().

Por qué usar str.casefold() es en lugar de str.lower() {#por quéusarstrcasefoldisnteadofstrlower}

El método anterior es adecuado para la mayoría de los casos de uso. Hace lo que se supone que debe hacer siguiendo algunas reglas simples. A partir de Python 3.0, las cadenas se representan como matrices de caracteres Unicode, lo que facilita que str.lower() reemplace cada código de una letra mayúscula con el código de la letra minúscula correspondiente.

Ese principio funciona bien en casi todos los casos de uso, pero hay algunos casos en los que debería considerar usar el método str.casefold() en su lugar.

Por ejemplo, al implementar coincidencia sin mayúsculas y minúsculas de dos cadenas, str.casefold() es el camino a seguir. Dado que Python usa Unicode para representar cadenas, todas las reglas definidas en el estándar Unicode también se aplican a Python. En la sección 3.13 la Norma establece lo siguiente:

Una cadena X es una coincidencia sin mayúsculas y minúsculas para una cadena Y si y solo si:

1
toCasefold(X) = toCasefold(Y)

Debido a que str.casefold() es la implementación de Python del método Unicode toCasefold(), debe usarlo cuando implemente coincidencias sin mayúsculas y minúsculas.

{.icon aria-hidden=“true”}

Nota: Los métodos X.casefold() y toCasefold(X) mapean cada carácter de la cadena X en su correspondiente casefold, como se define en el archivo CaseFolding.txt en Unicode Base de datos de personajes.

Para ilustrar la diferencia entre str.lower() y str.casefold(), echemos un vistazo al ejemplo de la letra alemana "ß", una letra minúscula que es igual a " ss". Eso significa que se supone que las siguientes cadenas son la coincidencia exacta sin mayúsculas y minúsculas:

1
2
A = "ßaBcß"
B = "ssAbCss"

Pero si intenta compararlos usando el método str.lower(), no obtendrá el resultado esperado:

1
2
3
4
5
Al = A.lower()
Bl = B.lower()

print(Al == Bl)
# Output: False

Esta comparación producirá el valor False, lo que significa que A.lower() no es igual a B.lower(). Esto se debe a que "ß" ya es una letra minúscula, por lo que el método str.lower() no la cambiará. Por lo tanto, ‘Al’ y ‘Bl’ tienen los siguientes valores:

1
2
Al = "ßabcß"
Bl = "ssabcss"

Obviamente, ‘Al’ no es igual a ‘Bl’, por lo que la comparación anterior debe producir el valor ‘Falso’.

Para corregir este comportamiento inesperado, debe utilizar el método str.casefold(). Es más agresivo en comparación con str.lower() porque eliminará absolutamente todas las diferencias en mayúsculas y minúsculas en una cadena. Por lo tanto, "ß" será reemplazado por "ss" y puede hacer coincidir sin mayúsculas y minúsculas las cadenas A y B:

1
2
3
4
5
Ac = A.casefold()
# Ac = "ssabcss"

Bc = B.casefold()
# Bc = "ssabcss"

Ahora, si compara las cadenas “A” y “B”, obtendrá el resultado esperado, el mismo que se define en el Unicode Standard:

1
2
print(Ac == Bc)
# Output: True

{.icon aria-hidden=“true”}

Alerta: El tipo de coincidencia sin mayúsculas y minúsculas que se muestra se denomina coincidencia sin mayúsculas y minúsculas predeterminada, que es el tipo más básico de coincidencia sin mayúsculas y minúsculas definido por el estándar Unicode.
Hay tres tipos más de coincidencias sin mayúsculas y minúsculas definidas en el estándar Unicode: coincidencia sin mayúsculas y minúsculas canónica, de compatibilidad y de identificador. Cada uno de ellos implica que se agregan uno o más pasos para mejorar la corrección de la coincidencia en un uso más específico. casos. Esos pasos adicionales generalmente consisten en normalizar cadenas durante la coincidencia (que no se realiza durante la coincidencia sin mayúsculas y minúsculas predeterminada).

Problemas con str.casefold()

Aunque str.casefold() es un método integrado de Python destinado a implementar el método toCasefold() del estándar Unicode, definitivamente no debe usarlo sin cuidado. Hay algunos casos extremos en los que no producirá el resultado deseado.

Por ejemplo, el estándar Unicode define la versión en mayúsculas (minúsculas) de la letra mayúscula I como i, lo que está en línea con su uso en la mayoría de los idiomas. Pero ese mapeo no puede funcionar en turco. El idioma turco tiene dos variantes de la letra I con sus propias minúsculas correspondientes:

  • i mayúscula - I (similar a la letra mayúscula habitual i)
    • with its lowercase variant - ı
  • i mayúscula punteada - İ
    • with its lowercase variant - i (similar to the usual lowercase letter i)

En consecuencia, la codificación Unicode estándar no funcionaría en el idioma turco. Por eso, el estándar Unicode definió dos asignaciones de plegamiento de casos diferentes: para idiomas turcos y no turcos. La variante turca toma en cuenta los matices mencionados del idioma turco y la variante no turca asigna la “I” mayúscula a su equivalente habitual en minúsculas “i”.

Por otro lado, str.casefold() usa solo el mapeo de pliegues de casos predeterminado (no turco), por lo tanto, no puede realizar coincidencias sin mayúsculas y minúsculas en turco para algunas palabras.

{.icon aria-hidden=“true”}

Nota: ¡Por lo tanto, se dice que str.casefold() no pasa la prueba turca!

Por ejemplo, se supone que las siguientes cadenas son una coincidencia sin mayúsculas y minúsculas en turco:

1
2
str1 = "Iabcİ"
str2 = "ıabci"

Pero, en la práctica, la comparación habitual arrojará el valor Falso:

1
2
3
print(str1.casefold() == str2.casefold())
# "iabci" == "ıabci"
# Outputs: False

Tenga en cuenta que str.casefold() convirtió tanto I como İ en el mismo carácter en minúsculas - i, que está de acuerdo con el mapeo estándar (no turco) del estándar Unicode. Eso es lo que causó el resultado no deseado de esta coincidencia sin caso.

Este ejemplo ilustra el caso cuando str.casefold() produce el resultado incorrecto de coincidencia sin mayúsculas y minúsculas en un idioma específico. Por lo tanto, debe prestar atención a los detalles del idioma con el que está trabajando.

Conclusión

Después de leer esta guía, comprenderá cuál es la forma más genérica de convertir una cadena a minúsculas en Python, así como cuál es el enfoque alternativo.

En breve cubrimos el método str.lower() en Python y luego nos sumergimos en los detalles del método str.casefold().

Hemos cubierto sus casos de uso básicos, los comparamos con el método str.lower(), explicamos los conceptos y estándares básicos que rodean la implementación de Python del algoritmo de plegado de casos.

Al final, hemos discutido algunos casos de uso problemáticos para que pueda estar al tanto de algunos de los resultados no deseados que puede producir el método str.casefold().

Licensed under CC BY-NC-SA 4.0