¿Cómo minúsculo una cadena en Python?


2058

¿Hay alguna manera de convertir una cadena de mayúsculas, o incluso parte de mayúsculas a minúsculas?

Por ejemplo, "Kilómetros" → "kilómetros".

Respuestas:



259

¿Cómo convertir cadenas a minúsculas en Python?

¿Hay alguna forma de convertir una cadena completa introducida por el usuario de mayúsculas, o incluso parte de mayúsculas a minúsculas?

Ej. Kilómetros -> kilómetros

La forma canónica pitónica de hacer esto es

>>> 'Kilometers'.lower()
'kilometers'

Sin embargo, si el propósito es hacer una coincidencia entre mayúsculas y minúsculas, debe usar mayúsculas y minúsculas:

>>> 'Kilometers'.casefold()
'kilometers'

Este es el por qué:

>>> "Maße".casefold()
'masse'
>>> "Maße".lower()
'maße'
>>> "MASSE" == "Maße"
False
>>> "MASSE".lower() == "Maße".lower()
False
>>> "MASSE".casefold() == "Maße".casefold()
True

Este es un método str en Python 3, pero en Python 2, querrá ver PyICU o py2casefold; varias respuestas abordan esto aquí .

Unicode Python 3

Python 3 maneja literales de cadena simple como unicode:

>>> string = 'Километр'
>>> string
'Километр'
>>> string.lower()
'километр'

Python 2, los literales de cadena simple son bytes

En Python 2, el siguiente, pegado en un shell, codifica el literal como una cadena de bytes, utilizando utf-8 .

Y lowerno asigna ningún cambio que los bytes conozcan, por lo que obtenemos la misma cadena.

>>> string = 'Километр'
>>> string
'\xd0\x9a\xd0\xb8\xd0\xbb\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80'
>>> string.lower()
'\xd0\x9a\xd0\xb8\xd0\xbb\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80'
>>> print string.lower()
Километр

En los scripts, Python objetará que los bytes no ascii (a partir de Python 2.5 y advertencia en Python 2.4) estén en una cadena sin codificación, ya que la codificación prevista sería ambigua. Para obtener más información al respecto, consulte el tutorial sobre Unicode en los documentos y PEP 263

Use literales Unicode, no strliterales

Por lo tanto, necesitamos una unicodecadena para manejar esta conversión, que se logra fácilmente con un literal de cadena unicode, que se desambigua con un uprefijo (y tenga en cuenta que el uprefijo también funciona en Python 3):

>>> unicode_literal = u'Километр'
>>> print(unicode_literal.lower())
километр

Tenga en cuenta que los bytes son completamente diferentes de los strbytes: al carácter de escape le '\u'sigue el ancho de 2 bytes o la representación de 16 bits de estas unicodeletras:

>>> unicode_literal
u'\u041a\u0438\u043b\u043e\u043c\u0435\u0442\u0440'
>>> unicode_literal.lower()
u'\u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440'

Ahora, si solo lo tenemos en forma de a str, necesitamos convertirlo a unicode. El tipo Unicode de Python es un formato de codificación universal que tiene muchas ventajas en relación con la mayoría de las otras codificaciones. Podemos usar el unicodeconstructor o el str.decodemétodo con el códec para convertirlo stra unicode:

>>> unicode_from_string = unicode(string, 'utf-8') # "encoding" unicode from string
>>> print(unicode_from_string.lower())
километр
>>> string_to_unicode = string.decode('utf-8') 
>>> print(string_to_unicode.lower())
километр
>>> unicode_from_string == string_to_unicode == unicode_literal
True

Ambos métodos se convierten al tipo unicode, y lo mismo que el unicode_literal.

Mejor práctica, use Unicode

Se recomienda que siempre trabaje con texto en Unicode .

El software solo debería funcionar con cadenas Unicode internamente, convirtiéndose a una codificación particular en la salida.

Puede codificar de nuevo cuando sea necesario

Sin embargo, para volver a escribir en minúsculas str, codifique la cadena de Python utf-8nuevamente:

>>> print string
Километр
>>> string
'\xd0\x9a\xd0\xb8\xd0\xbb\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80'
>>> string.decode('utf-8')
u'\u041a\u0438\u043b\u043e\u043c\u0435\u0442\u0440'
>>> string.decode('utf-8').lower()
u'\u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440'
>>> string.decode('utf-8').lower().encode('utf-8')
'\xd0\xba\xd0\xb8\xd0\xbb\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80'
>>> print string.decode('utf-8').lower().encode('utf-8')
километр

Entonces, en Python 2, Unicode puede codificar en cadenas de Python, y las cadenas de Python pueden decodificar en el tipo Unicode.


Tengo una nota que no necesariamente se aplica a la pregunta del OP, pero que es importante con la portabilidad (internacionalización) cuando se hacen coincidencias entre mayúsculas y minúsculas. Con la coincidencia entre mayúsculas y minúsculas, los signos diacríticos (acentos) pueden convertirse en una preocupación. Ejemplo: >>> "raison d'être".casefold(); "raison d'être"Vea esta respuesta sobreunidecode
bballdave025

198

Con Python 2, esto no funciona para palabras que no están en inglés en UTF-8. En este caso decode('utf-8')puede ayudar:

>>> s='Километр'
>>> print s.lower()
Километр
>>> print s.decode('utf-8').lower()
километр

8
Quizás deberíamos ser un poco más explícitos al decir que decode('utf-8')no solo es innecesario en Python 3, sino que causa un error. ( ref ) Ejemplo: $python3; >>>s='Километр'; >>>print (s.lower); #result: километр >>>s.decode('utf-8').lower(); #result: ...AttributeError: 'str' object has no attribute 'decode'podemos ver una segunda forma de hacerlo, haciendo referencia a la excelente respuesta de @AaronHall. >>>s.casefold() #result: километр
bballdave025

20

Además, puede sobrescribir algunas variables:

s = input('UPPER CASE')
lower = s.lower()

Si usas así:

s = "Kilometer"
print(s.lower())     - kilometer
print(s)             - Kilometer

Funcionará justo cuando se le llame.


10
La pregunta es cómo transformar cadenas en minúsculas. ¿Cómo esta respuesta obtuvo tantos votos positivos?
Munim Munna

1
s=s.lower()Es el camino a seguir.
m00lti

1

No intentes esto, no lo recomiendo totalmente, no hagas esto:

import string
s='ABCD'
print(''.join([string.ascii_lowercase[string.ascii_uppercase.index(i)] for i in s]))

Salida:

abcd

Dado que nadie lo escribió todavía, puede usarlo swapcase(por lo que las letras mayúsculas se convertirán en minúsculas y viceversa) (y este debe usarlo en los casos en que acabo de mencionar (convertir de superior a inferior, de inferior a superior)):

s='ABCD'
print(s.swapcase())

Salida:

abcd
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.