Come faccio a mettere in minuscolo una stringa in Python?


Risposte:



259

Come convertire una stringa in minuscolo in Python?

Esiste un modo per convertire una stringa immessa da un intero utente da maiuscola o anche da parte maiuscola a minuscola?

Ad esempio chilometri -> chilometri

Il modo canonico pitone di farlo è

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

Tuttavia, se lo scopo è fare una corrispondenza senza distinzione tra maiuscole e minuscole, è necessario utilizzare la piegatura delle maiuscole:

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

Ecco perché:

>>> "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

Questo è un metodo str in Python 3, ma in Python 2, ti consigliamo di guardare PyICU o py2casefold - diverse risposte indirizzano questo qui .

Unicode Python 3

Python 3 gestisce i letterali di stringhe semplici come unicode:

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

Python 2, letterali di stringhe semplici sono byte

In Python 2, il seguente, incollato in una shell, codifica il valore letterale come una stringa di byte, usando utf-8 .

E lowernon mappa alcuna modifica di cui i byte sarebbero a conoscenza, quindi otteniamo la stessa stringa.

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

Negli script, Python si opporrà a byte non ascii (a partire da Python 2.5, e avvertimento in Python 2.4) che si trovano in una stringa senza codifica, poiché la codifica prevista sarebbe ambigua. Per ulteriori informazioni, consulta la procedura Unicode nei documenti e PEP 263

Usa letterali Unicode, non strletterali

Quindi abbiamo bisogno di una unicodestringa per gestire questa conversione, realizzata facilmente con una stringa unicode letterale, che si discambia con un uprefisso (e nota che il uprefisso funziona anche in Python 3):

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

Si noti che i byte sono completamente diversi dai strbyte: il carattere di escape è '\u'seguito dalla larghezza di 2 byte o dalla rappresentazione a 16 bit di queste unicodelettere:

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

Ora, se lo abbiamo solo nella forma di a str, dobbiamo convertirlo in unicode. Il tipo Unicode di Python è un formato di codifica universale che presenta molti vantaggi rispetto alla maggior parte delle altre codifiche. Possiamo usare il unicodecostruttore o il str.decodemetodo con il codec per convertire strin 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

Entrambi i metodi vengono convertiti nel tipo unicode e lo stesso di unicode_literal.

Best practice, utilizzare Unicode

Si consiglia di lavorare sempre con il testo in Unicode .

Il software dovrebbe funzionare solo con stringhe Unicode internamente, convertendosi in una particolare codifica in uscita.

Può ricodificare quando necessario

Tuttavia, per ripristinare il carattere minuscolo str, codificare utf-8nuovamente la stringa Python :

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

Quindi in Python 2, Unicode può codificare in stringhe Python e le stringhe Python possono decodificare nel tipo Unicode.


Ho una nota che non si applica necessariamente alla domanda del PO, ma che è importante per la portabilità (internazionalizzazione) quando si fa una corrispondenza senza distinzione tra maiuscole e minuscole. Con la corrispondenza senza distinzione tra maiuscole e minuscole, i segni diacritici (segni di accento) possono diventare un problema. Esempio: dai >>> "raison d'être".casefold(); "raison d'être"un'occhiata a questa risposta suunidecode
bballdave025,

198

Con Python 2, questo non funziona con parole non inglesi in UTF-8. In questo caso decode('utf-8')può aiutare:

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

8
Forse dovremmo essere un po 'più espliciti dicendo che decode('utf-8')non è solo non necessario in Python 3, ma causa un errore. ( rif ). Esempio: $python3; >>>s='Километр'; >>>print (s.lower); #result: километр >>>s.decode('utf-8').lower(); #result: ...AttributeError: 'str' object has no attribute 'decode'possiamo vedere un secondo modo per farlo, facendo riferimento alla risposta eccellente di @AaronHall. >>>s.casefold() #result: километр
bballdave025,

20

Inoltre, puoi sovrascrivere alcune variabili:

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

Se lo usi in questo modo:

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

Funzionerà proprio quando viene chiamato.


10
La domanda è come trasformare la stringa in minuscolo. In che modo questa risposta ha ottenuto così tanti voti positivi?
Munim Munna,

1
s=s.lower()è la strada da percorrere.
m00lti,

1

Non provarlo, assolutamente sconsigliato, non farlo:

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

Produzione:

abcd

Dato che nessuno lo ha ancora scritto, puoi usarlo swapcase(quindi le lettere maiuscole diventeranno minuscole e viceversa) (e questo dovresti usare nei casi in cui ho appena menzionato (converti maiuscole / minuscole, inferiori a maiuscole)):

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

Produzione:

abcd
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.