stringhe - python sostituire caratteri stringa




Come minuscole una stringa in Python? (4)

Come convertire la stringa in lettere minuscole in Python?

Esiste un modo per convertire un'intera stringa immessa dall'utente da maiuscole o anche parzialmente maiuscole minuscole?

Es. Chilometri -> chilometri

Il modo canonico di fare questo è Python

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

Tuttavia, se lo scopo è fare la corrispondenza senza distinzione tra maiuscole e minuscole, dovresti utilizzare la piegatura di maiuscole / minuscole:

>>> '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 esaminare PyICU o py2casefold - diverse risposte affrontano questo argomento qui .

Unicode Python 3

Python 3 gestisce unicode come stringhe regolari:

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

Unicode Python 2

Ma Python 2 no, il sotto, incollato in una shell, codifica il letterale come una stringa di byte, usando utf-8 .

E lower non mappa le modifiche di cui gli oggetti Unicode nativi 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 obietterà a byte non-ascii (come in Python 2.5 e warning in Python 2.4) in una stringa senza alcuna codifica data, poiché la codifica desiderata sarebbe ambigua. Per ulteriori informazioni, consultare la guida Unicode nei docs e in PEP 263

Usa letterali Unicode, non str letterali

Quindi abbiamo bisogno di una stringa unicode per gestire questa conversione, realizzata facilmente con un letterale unicode:

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

Si noti che i byte sono completamente diversi dagli str byte: il carattere di escape è '\u' seguito dalla larghezza di 2 byte o dalla rappresentazione a 16 bit di queste lettere unicode :

>>> 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 sotto forma di str , dobbiamo convertirlo in unicode . Il tipo Unicode di Python è un formato di codifica universale che presenta molti advantages rispetto alla maggior parte delle altre codifiche. Possiamo usare il costruttore unicode o il metodo str.decode con il codec per convertire lo str in 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 nello stesso modo in unicode_literal.

Best Practice, usa Unicode

Si consiglia di lavorare sempre con il testo in Unicode .

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

Può codificare quando necessario

Tuttavia, per riportare il carattere minuscolo in str , codifica nuovamente la stringa python su utf-8 :

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

Esiste un modo per convertire una stringa da maiuscole o anche parzialmente maiuscole in minuscole?

Es. Chilometri -> chilometri.


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

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

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

Poiché nessuno lo ha ancora scritto, puoi usare swapcase (le lettere maiuscole diventeranno minuscole e viceversa) (e questa dovrebbe essere usata nei casi in cui ho appena menzionato (converti in alto in basso, in basso in alto)):

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

Produzione:

abcd

Puoi fare quello che Peter ha detto , o se vuoi che l'utente inserisca qualcosa, potresti fare il seguente codice:

raw_input('Type Something').lower()

Quindi convertirà automaticamente la stringa che hanno digitato in minuscolo.

Nota: raw_input stato rinominato in input in Python 3.xe versioni successive.





lowercase