ฉันจะพิมพ์เล็กสตริงใน Python ได้อย่างไร


2055

มีวิธีการแปลงสตริงจากตัวพิมพ์ใหญ่หรือแม้แต่ตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็ก?

ตัวอย่างเช่น "Kilometers" → "กิโลเมตร"

คำตอบ:


3087

ใช้.lower()- ตัวอย่างเช่น:

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

เอกสาร 2.x อย่างเป็นทางการอยู่ที่นี่: เอกสาร 3.x อย่างเป็นทางการอยู่ที่นี่:str.lower()
str.lower()


259

วิธีแปลงสตริงเป็นตัวพิมพ์เล็กใน Python

มีวิธีการแปลงสตริงทั้งหมดที่ผู้ใช้ป้อนจากตัวพิมพ์ใหญ่หรือแม้กระทั่งส่วนตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็ก?

เช่นกิโลเมตร -> กิโลเมตร

วิธี Pythonic ที่เป็นที่ยอมรับในการทำเช่นนี้คือ

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

อย่างไรก็ตามหากจุดประสงค์คือการจับคู่แบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่คุณควรใช้ตัวพิมพ์เล็ก:

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

นี่คือเหตุผล:

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

นี้เป็นวิธี STR ในหลาม 3 แต่ในหลาม 2 คุณจะต้องการที่จะมองไปที่ PyICU หรือ py2casefold - หลายคำตอบอยู่ที่นี่

Unicode Python 3

Python 3จัดการตัวอักษรสตริงธรรมดาเป็นยูนิโค้ด:

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

Python 2 ตัวอักษรสตริงธรรมดาเป็นไบต์

ในหลาม 2 utf-8ด้านล่างวางลงในเปลือกถอดรหัสอักษรเป็นสตริงไบต์โดยใช้

และlowerไม่แมปการเปลี่ยนแปลงใด ๆ ที่ไบต์จะรับรู้ดังนั้นเราจึงได้รับสายอักขระเดียวกัน

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

ในสคริปต์ Python จะคัดค้านไม่ใช่ non-ascii (ตั้งแต่ Python 2.5 และคำเตือนใน Python 2.4) ไบต์ที่อยู่ในสตริงโดยไม่มีการเข้ารหัสที่กำหนดไว้เนื่องจากการเข้ารหัสที่ต้องการจะคลุมเครือ ดูข้อมูลเพิ่มเติมได้จาก Unicode วิธีการในเอกสารและPEP 263

ใช้ตัวอักษร Unicode ไม่ใช่strตัวอักษร

ดังนั้นเราจึงต้องใช้unicodeสตริงเพื่อจัดการการแปลงนี้สามารถทำได้อย่างง่ายดายด้วยตัวอักษรสตริงของยูนิโค้ดซึ่งตัดuคำนำหน้าด้วยคำนำหน้า (และสังเกตว่าuคำนำหน้ายังทำงานใน Python 3):

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

โปรดทราบว่าไบต์นั้นแตกต่างจากไบต์อย่างสิ้นเชิงstr- อักขระเลี่ยง'\u'ตามด้วยความกว้าง 2 ไบต์หรือการแทนunicodeตัวอักษร16 บิต:

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

ตอนนี้ถ้าเรามีเพียงในรูปแบบของเราต้องแปลงเป็นstr unicodeประเภท Unicode ของ Python เป็นรูปแบบการเข้ารหัสสากลที่มีข้อได้เปรียบมากมายเมื่อเทียบกับการเข้ารหัสอื่น ๆ ส่วนใหญ่ เราสามารถใช้unicodeคอนสตรัคหรือstr.decodeวิธีการที่มีตัวแปลงสัญญาณในการแปลงstrไป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

ทั้งสองวิธีแปลงเป็นชนิด unicode - และเหมือนกับ unicode_literal

วิธีปฏิบัติที่ดีที่สุดใช้ Unicode

ขอแนะนำให้คุณทำงานกับข้อความใน Unicodeเสมอ

ซอฟต์แวร์ควรทำงานกับสตริง Unicode ภายในเท่านั้นและแปลงเป็นการเข้ารหัสเฉพาะในเอาต์พุต

สามารถเข้ารหัสกลับเมื่อจำเป็น

อย่างไรก็ตามเพื่อให้ตัวพิมพ์เล็กกลับมาstrให้เข้ารหัสสตริงไพ ธ อน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')
километр

ดังนั้นใน Python 2 Unicode สามารถเข้ารหัสเป็นสตริง Python และสตริง Python สามารถถอดรหัสเป็นประเภท Unicode


ฉันมีบันทึกย่อหนึ่งที่ไม่จำเป็นต้องใช้กับคำถามของ OP แต่สำคัญกับความสะดวกในการพกพา ด้วยการจับคู่ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เครื่องหมายกำกับเสียง (เครื่องหมายเน้นเสียง) อาจกลายเป็นข้อกังวล ตัวอย่าง: >>> "raison d'être".casefold(); "raison d'être"ลองดูคำตอบนี้เกี่ยวกับunidecode
bballdave025

198

ด้วย Python 2 สิ่งนี้ไม่สามารถใช้ได้กับคำที่ไม่ใช่ภาษาอังกฤษใน UTF-8 ในกรณีนี้decode('utf-8')สามารถช่วย:

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

8
บางทีเราควรจะมีความชัดเจนมากขึ้นโดยบอกว่าdecode('utf-8')ไม่เพียง แต่ไม่จำเป็นใน Python 3 แต่เป็นสาเหตุของข้อผิดพลาด ( อ้างอิง ) ตัวอย่าง: $python3; >>>s='Километр'; >>>print (s.lower); #result: километр >>>s.decode('utf-8').lower(); #result: ...AttributeError: 'str' object has no attribute 'decode'เราสามารถเห็นวิธีที่สองในการทำสิ่งนี้โดยอ้างอิงคำตอบที่ยอดเยี่ยมของ @AaronHall >>>s.casefold() #result: километр
bballdave025

20

นอกจากนี้คุณสามารถเขียนทับตัวแปรบางตัวได้:

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

หากคุณใช้สิ่งนี้:

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

มันจะทำงานเมื่อเรียก


10
คำถามคือวิธีการแปลงสตริงเป็นตัวพิมพ์เล็ก คำตอบนี้มีคะแนนโหวตเพิ่มขึ้นมากแค่ไหน?
Munim Munna

1
s=s.lower()เป็นวิธีที่จะไป
m00lti

1

อย่าลองสิ่งนี้โดยไม่แนะนำทั้งหมดอย่าทำสิ่งนี้:

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

เอาท์พุท:

abcd

เนื่องจากยังไม่มีใครเขียน แต่คุณสามารถใช้swapcase(ดังนั้นตัวอักษรตัวพิมพ์ใหญ่จะกลายเป็นตัวพิมพ์เล็กและในทางกลับกัน) (และอันนี้คุณควรใช้ในกรณีที่ฉันเพิ่งพูดถึง (แปลงบนเป็นล่างล่างถึงบน):

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

เอาท์พุท:

abcd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.