Bagaimana cara menurunkan string dengan Python?

2056

Apakah ada cara untuk mengubah string dari huruf besar, atau bahkan bagian huruf besar menjadi huruf kecil?

Misalnya, "Kilometer" → "kilometer".

Benjamin Didur
sumber

Jawaban:

3087

Gunakan .lower()- Misalnya:

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

Dokumentasi 2.x resmi ada di sini: Dokumentasi resmi 3.x ada di sini:str.lower()
str.lower()

Petar Ivanov
sumber
259

Bagaimana cara mengubah string menjadi huruf kecil dengan Python?

Apakah ada cara untuk mengubah seluruh string yang dimasukkan pengguna dari huruf besar, atau bahkan bagian huruf besar menjadi huruf kecil?

Misalnya Kilometer -> kilometer

Cara Pythonic kanonik untuk melakukan ini adalah

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

Namun, jika tujuannya adalah untuk melakukan pencocokan case-sensitive, Anda harus menggunakan case-folding:

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

Inilah alasannya:

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

Ini adalah metode str dalam Python 3, tetapi dalam Python 2, Anda ingin melihat PyICU atau py2casefold - beberapa jawaban menjawab ini di sini .

Unicode Python 3

Python 3 menangani string string literal sebagai unicode:

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

Python 2, literal string biasa adalah byte

Dalam Python 2, di bawah ini, disisipkan ke dalam shell, mengkodekan literal sebagai string byte, menggunakan utf-8.

Dan lowertidak memetakan perubahan apa pun yang akan disadari oleh byte, jadi kami mendapatkan string yang sama.

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

Dalam skrip, Python akan keberatan dengan non-ascii (per Python 2.5, dan peringatan dalam Python 2.4) byte berada dalam string tanpa pengkodean yang diberikan, karena pengkodean yang dimaksud akan ambigu. Untuk lebih lanjut tentang itu, lihat Unicode how-to di dokumen dan PEP 263

Gunakan Unicode literal, bukan strliteral

Jadi kita membutuhkan unicodestring untuk menangani konversi ini, diselesaikan dengan mudah dengan string unicode literal, yang disatukan dengan uawalan (dan perhatikan uawalan juga bekerja di Python 3):

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

Perhatikan bahwa byte benar-benar berbeda dari strbyte - karakter escape '\u'diikuti oleh lebar 2-byte, atau representasi 16 bit dari unicodehuruf - huruf ini :

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

Sekarang jika kita hanya memilikinya dalam bentuk a str, kita perlu mengubahnya menjadi unicode. Jenis Unicode Python adalah format penyandian universal yang memiliki banyak keunggulan relatif terhadap kebanyakan penyandian lainnya. Kita dapat menggunakan unicodekonstruktor atau str.decodemetode dengan codec untuk mengonversikan strke 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

Kedua metode dikonversi ke jenis unicode - dan sama dengan unicode_literal.

Praktik Terbaik, gunakan Unicode

Disarankan agar Anda selalu bekerja dengan teks dalam Unicode .

Perangkat lunak hanya boleh bekerja dengan string Unicode secara internal, mengonversi ke pengkodean tertentu pada output.

Dapat menyandikan kembali bila perlu

Namun, untuk mendapatkan huruf kecil kembali ketik str, encode string python ke utf-8lagi:

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

Jadi dalam Python 2, Unicode dapat mengkodekan ke string Python, dan string Python dapat mendekode ke dalam tipe Unicode.

Aaron Hall
sumber
Saya punya satu catatan yang tidak selalu berlaku untuk pertanyaan OP, tetapi yang penting dengan portabilitas (internasionalisasi) ketika melakukan pencocokan yang sensitif terhadap kasus. Dengan pencocokan case-insensitive, diakritik (tanda aksen) dapat menjadi perhatian. Contoh: >>> "raison d'être".casefold(); "raison d'être"Lihat jawaban ini tentangunidecode
bballdave025
198

Dengan Python 2, ini tidak berfungsi untuk kata-kata non-Inggris di UTF-8. Dalam hal ini decode('utf-8')dapat membantu:

>>> s='Километр'
>>> print s.lower()
Километр
>>> print s.decode('utf-8').lower()
километр
Vladimir Gorovoy
sumber
8
Mungkin kita harus sedikit lebih eksplisit dengan mengatakan bahwa decode('utf-8')tidak hanya tidak perlu dalam Python 3, tetapi menyebabkan kesalahan. ( ref ). Contoh: $python3; >>>s='Километр'; >>>print (s.lower); #result: километр >>>s.decode('utf-8').lower(); #result: ...AttributeError: 'str' object has no attribute 'decode'Kita dapat melihat cara kedua untuk melakukan ini, merujuk jawaban yang sangat bagus dari @AaronHall. >>>s.casefold() #result: километр
bballdave025
20

Anda juga dapat menimpa beberapa variabel:

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

Jika Anda menggunakan seperti ini:

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

Ini akan berfungsi saat dipanggil.

jadi
sumber
10
Pertanyaannya adalah bagaimana mengubah string menjadi huruf kecil. Bagaimana jawaban ini mendapat begitu banyak suara?
Munim Munna
1
s=s.lower()adalah cara untuk pergi.
m00lti
1

Jangan coba ini, sama sekali tidak merekomendasikan, jangan lakukan ini:

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

Keluaran:

abcd

Karena belum ada yang menulisnya, Anda dapat menggunakan swapcase(jadi huruf besar akan menjadi huruf kecil, dan sebaliknya) (dan yang ini harus Anda gunakan dalam kasus di mana saya baru saja menyebutkan (konversi atas ke bawah, bawah ke atas)):

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

Keluaran:

abcd
U10-Maju
sumber