Como faço para minúscula uma seqüência de caracteres em Python?

2056

Existe uma maneira de converter uma seqüência de caracteres em maiúsculas ou mesmo parte maiúscula em minúscula?

Por exemplo, "Quilômetros" → "quilômetros".

Benjamin Didur
fonte

Respostas:

3087

Use .lower()- por exemplo:

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

A documentação oficial 2.x está aqui: A documentação oficial 3.x está aqui:str.lower()
str.lower()

Petar Ivanov
fonte
259

Como converter string para minúsculas em Python?

Existe alguma maneira de converter uma seqüência de caracteres inserida pelo usuário inteira de maiúscula ou mesmo parte maiúscula para minúscula?

Por exemplo Quilômetros -> quilômetros

A maneira pitônica canônica de fazer isso é

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

No entanto, se o objetivo é fazer uma correspondência sem distinção entre maiúsculas e minúsculas, você deve usar a dobra de maiúsculas e minúsculas:

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

Aqui está o porquê:

>>> "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 é um método str no Python 3, mas no Python 2, você deve examinar o PyICU ou py2casefold - várias respostas abordam isso aqui .

Unicode Python 3

O Python 3 manipula literais de cadeia simples como unicode:

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

Python 2, literais de cadeia simples são bytes

No Python 2, o abaixo, colado em um shell, codifica o literal como uma sequência de bytes, usando utf-8.

E lowernão mapeia nenhuma alteração que os bytes tenham conhecimento, então obtemos a mesma string.

>>> 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()
Километр

Nos scripts, o Python objetará que bytes não-ascii (no Python 2.5 e aviso no Python 2.4) estejam em uma string sem codificação fornecida, pois a codificação pretendida seria ambígua. Para obter mais informações, consulte o tutorial sobre Unicode nos documentos e PEP 263

Use literais Unicode, não strliterais

Portanto, precisamos de uma unicodestring para lidar com essa conversão, realizada facilmente com uma literal de string unicode, que desambigua um uprefixo (e observe que o uprefixo também funciona no Python 3):

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

Observe que os bytes são completamente diferentes dos strbytes - o caractere de escape é '\u'seguido pela largura de 2 bytes ou pela representação de 16 bits dessas unicodeletras:

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

Agora, se o temos apenas na forma de a str, precisamos convertê-lo para unicode. O tipo Unicode do Python é um formato de codificação universal que possui muitas vantagens em relação à maioria das outras codificações. Podemos usar o unicodeconstrutor ou o str.decodemétodo com o codec para converter o strem 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 os métodos são convertidos para o tipo unicode - e o mesmo que o unicode_literal.

Prática recomendada, use Unicode

É recomendável que você sempre trabalhe com texto em Unicode .

O software deve funcionar apenas com cadeias Unicode internamente, convertendo para uma codificação específica na saída.

Pode codificar de volta quando necessário

No entanto, para obter o tipo de letra minúscula novamente str, codifique a string python utf-8novamente:

>>> 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')
километр

Portanto, no Python 2, o Unicode pode codificar em seqüências de caracteres Python, e as strings de Python podem decodificar no tipo Unicode.

Aaron Hall
fonte
Tenho uma observação que não se aplica necessariamente à pergunta do OP, mas que é importante com a portabilidade (internacionalização) ao fazer a correspondência sem distinção entre maiúsculas e minúsculas. Com a correspondência sem distinção entre maiúsculas e minúsculas, os sinais diacríticos (acentos) podem se tornar uma preocupação. Exemplo: >>> "raison d'être".casefold(); "raison d'être"Confira esta resposta sobreunidecode
bballdave025
198

Com o Python 2, isso não funciona para palavras não inglesas no UTF-8. Nesse caso, decode('utf-8')pode ajudar:

>>> s='Километр'
>>> print s.lower()
Километр
>>> print s.decode('utf-8').lower()
километр
Vladimir Gorovoy
fonte
8
Talvez devêssemos ser um pouco mais explícitos ao dizer que isso decode('utf-8')não é apenas desnecessário no Python 3, mas causa um erro. ( ref ) Exemplo: $python3; >>>s='Километр'; >>>print (s.lower); #result: километр >>>s.decode('utf-8').lower(); #result: ...AttributeError: 'str' object has no attribute 'decode'podemos ver uma segunda maneira de fazer isso, referenciando a excelente resposta de @AaronHall. >>>s.casefold() #result: километр
bballdave025
20

Além disso, você pode substituir algumas variáveis:

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

Se você usa assim:

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

Funcionará exatamente quando chamado.

logo
fonte
10
A questão é como transformar string em minúscula. Como esta resposta obteve tantos votos positivos?
Munim Munna
1
s=s.lower()é o caminho a percorrer.
M00lti 07/08
1

Não tente isso, totalmente não recomendado, não faça isso:

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

Resultado:

abcd

Como ninguém o escreveu ainda, você pode usá- swapcaselo (para que as letras maiúsculas se tornem minúsculas e vice-versa) (e essa você deve usar nos casos em que acabei de mencionar (converter superior para inferior, inferior para superior)):

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

Resultado:

abcd
Sub-10
fonte