Python'da bir dizeyi nasıl küçük harfle yazarım?


2056

Bir dizeyi büyük harften, hatta kısmen büyük harfe küçük harfe dönüştürmenin bir yolu var mı?

Örneğin, "Kilometre" → "kilometre".

Yanıtlar:



259

Nasıl dize Python küçük harf dönüştürmek için?

Kullanıcının girdiği dizenin tamamını büyük harften, hatta kısmen büyük harfe küçük harfe dönüştürmenin herhangi bir yolu var mı?

Eg Kilometre -> kilometre

Bunu yapmanın kanonik Pythonic yolu

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

Ancak, amaç büyük / küçük harfe duyarlı olmayan eşleştirme yapmaksa, büyük / küçük harf katlama kullanmalısınız:

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

İşte nedeni:

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

Bu Python 3'te bir str yöntemidir, ancak Python 2'de PyICU veya py2casefold'a bakmak isteyeceksiniz - birkaç cevap burada ele almaktadır .

Unicode Python 3

Python 3 düz dize değişmezlerini unicode olarak işler:

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

Python 2, düz dize değişmezleri bayttır

Python 2'de, bir kabuğa yapıştırılan aşağıdaki metin, değişmezi kullanarak bir bayt dizisi olarak kodlar utf-8.

Baytların lowerbileceği hiçbir değişikliği haritalamaz, bu yüzden aynı dizeyi alırız.

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

Komut dosyalarında Python, amaçlanan kodlama belirsiz olacağından, kodlama yapılmayan bir dizede olduğu gibi ascii olmayanlara (Python 2.5 ve Python 2.4'te uyarı) itiraz eder. Bununla ilgili daha fazla bilgi için dokümanlardaki Unicode nasıl yapılır bölümüne ve PEP 263'e bakın

Değişmez değerleri değil Unicode strdeğişmezlerini kullanma

Bu nedenle unicode, bir uönekle net olmayan bir unicode dize değişmeziyle kolayca gerçekleştirilen bu dönüşümü işlemek için bir dizeye ihtiyacımız var (ve uönekin Python 3'te de çalıştığını unutmayın ):

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

Baytların baytlardan tamamen farklı olduğuna dikkat edin str- kaçış karakterinden '\u'sonra 2 unicodeharflik genişlik veya bu harflerin 16 bitlik gösterimi gelir :

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

Şimdi sadece a şeklinde varsa, onu strdönüştürmemiz gerekir unicode. Python'un Unicode tipi, diğer çoğu kodlamaya göre birçok avantaja sahip evrensel bir kodlama formatıdır . Bunu dönüştürmek için yapıcıyı unicodeveya str.decodeyöntemi codec bileşeni ile strkullanabiliriz 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

Her iki yöntem de unicode türüne dönüştürülür ve unicode_literal ile aynıdır.

En İyi Uygulama, Unicode kullanın

Unicode'da her zaman metinle çalışmanız önerilir .

Yazılım, yalnızca dahili olarak Unicode dizeleriyle çalışarak çıktıdaki belirli bir kodlamaya dönüştürmelidir.

Gerektiğinde geri kodlayabilir

Ancak, küçük harfleri tekrar yazmak striçin python dizesini utf-8tekrar kodlayın :

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

Python 2'de, Unicode Python dizelerine kodlayabilir ve Python dizeleri Unicode türüne kod çözebilir.


OP'nin sorusu için mutlaka geçerli olmayan, ancak büyük / küçük harfe duyarlı olmayan eşleştirme yaparken taşınabilirlik (uluslararasılaşma) ile önemli olan bir notum var. Büyük / küçük harfe duyarsız eşleme ile aksan işaretleri (aksan işaretleri) endişe kaynağı olabilir. Örnek: >>> "raison d'être".casefold(); "raison d'être"Çıkış Bu cevabı hakkındaunidecode
bballdave025

198

Python 2 ile bu, UTF-8'deki İngilizce olmayan kelimeler için çalışmaz. Bu durumda decode('utf-8')yardımcı olabilir:

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

8
Belki de bunun decode('utf-8')sadece Python 3'te gereksiz olmadığını, aynı zamanda bir hataya neden olduğunu söyleyerek biraz daha açık olmalıyız . ( ref ). Örnek: $python3; >>>s='Километр'; >>>print (s.lower); #result: километр >>>s.decode('utf-8').lower(); #result: ...AttributeError: 'str' object has no attribute 'decode'@AaronHall'ın mükemmel cevabına atıfta bulunarak bunu yapmanın ikinci bir yolunu görebiliriz. >>>s.casefold() #result: километр
bballdave025

20

Ayrıca, bazı değişkenlerin üzerine yazabilirsiniz:

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

Eğer böyle kullanırsanız:

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

Sadece çağrıldığında çalışır.


10
Soru, dizenin küçük harfe nasıl dönüştürüleceğidir. Bu cevap nasıl bu kadar çok oy aldı?
Munim Munna

1
s=s.lower()gitmek için bir yoldur.
m00lti

1

Bunu denemeyin, tamamen tavsiye etmeyin, bunu yapma:

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

Çıktı:

abcd

Henüz kimse yazamadığı için kullanabilirsiniz swapcase(böylece büyük harfler küçük harf olur ve tersi de geçerlidir) (ve bu sadece az önce bahsettiğim durumlarda kullanmalısınız (yukarıdan aşağıya, aşağıdan yukarıya dönüştür)):

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

Çıktı:

abcd
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.