มีวิธีการแปลงสตริงจากตัวพิมพ์ใหญ่หรือแม้แต่ตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็ก?
ตัวอย่างเช่น "Kilometers" → "กิโลเมตร"
มีวิธีการแปลงสตริงจากตัวพิมพ์ใหญ่หรือแม้แต่ตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็ก?
ตัวอย่างเช่น "Kilometers" → "กิโลเมตร"
คำตอบ:
ใช้.lower()
- ตัวอย่างเช่น:
s = "Kilometer"
print(s.lower())
เอกสาร 2.x อย่างเป็นทางการอยู่ที่นี่:
เอกสาร 3.x อย่างเป็นทางการอยู่ที่นี่:str.lower()
str.lower()
วิธีแปลงสตริงเป็นตัวพิมพ์เล็กใน 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 - หลายคำตอบอยู่ที่นี่
Python 3จัดการตัวอักษรสตริงธรรมดาเป็นยูนิโค้ด:
>>> string = 'Километр'
>>> string
'Километр'
>>> string.lower()
'километр'
ในหลาม 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
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 ภายในเท่านั้นและแปลงเป็นการเข้ารหัสเฉพาะในเอาต์พุต
อย่างไรก็ตามเพื่อให้ตัวพิมพ์เล็กกลับมา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
ด้วย Python 2 สิ่งนี้ไม่สามารถใช้ได้กับคำที่ไม่ใช่ภาษาอังกฤษใน UTF-8 ในกรณีนี้decode('utf-8')
สามารถช่วย:
>>> s='Километр'
>>> print s.lower()
Километр
>>> print s.decode('utf-8').lower()
километр
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: километр
นอกจากนี้คุณสามารถเขียนทับตัวแปรบางตัวได้:
s = input('UPPER CASE')
lower = s.lower()
หากคุณใช้สิ่งนี้:
s = "Kilometer"
print(s.lower()) - kilometer
print(s) - Kilometer
มันจะทำงานเมื่อเรียก
s=s.lower()
เป็นวิธีที่จะไป
อย่าลองสิ่งนี้โดยไม่แนะนำทั้งหมดอย่าทำสิ่งนี้:
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
>>> "raison d'être".casefold(); "raison d'être"
ลองดูคำตอบนี้เกี่ยวกับunidecode