Có cách nào để chuyển đổi một chuỗi từ chữ hoa, hoặc thậm chí một phần chữ hoa thành chữ thường không?
Ví dụ: "Kilômét" → "km".
Có cách nào để chuyển đổi một chuỗi từ chữ hoa, hoặc thậm chí một phần chữ hoa thành chữ thường không?
Ví dụ: "Kilômét" → "km".
Câu trả lời:
Sử dụng .lower()
- Ví dụ:
s = "Kilometer"
print(s.lower())
Tài liệu 2.x chính thức có tại đây:
Tài liệu 3.x chính thức có tại đây:str.lower()
str.lower()
Làm cách nào để chuyển đổi chuỗi thành chữ thường trong Python?
Có cách nào để chuyển đổi toàn bộ chuỗi người dùng nhập từ chữ hoa hoặc thậm chí một phần chữ hoa sang chữ thường không?
Ví dụ: Kilômét -> km
Cách thức kinh điển của Pythonic là
>>> 'Kilometers'.lower()
'kilometers'
Tuy nhiên, nếu mục đích là để thực hiện khớp không phân biệt chữ hoa chữ thường, bạn nên sử dụng cách gấp chữ hoa:
>>> 'Kilometers'.casefold()
'kilometers'
Đây là lý do tại sao:
>>> "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
Đây là một phương thức str trong Python 3, nhưng trong Python 2, bạn sẽ muốn xem PyICU hoặc py2casefold - một số câu trả lời giải quyết vấn đề này ở đây .
Python 3 xử lý các chuỗi ký tự đơn giản là unicode:
>>> string = 'Километр'
>>> string
'Километр'
>>> string.lower()
'километр'
Trong Python 2, bên dưới, được dán vào một trình bao, mã hóa bằng chữ thành một chuỗi byte, sử dụng utf-8
.
Và lower
không ánh xạ bất kỳ thay đổi nào mà byte sẽ nhận ra, vì vậy chúng tôi nhận được cùng một chuỗi.
>>> 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()
Километр
Trong các tập lệnh, Python sẽ phản đối các non-ascii (kể từ Python 2.5 và cảnh báo trong Python 2.4) các byte nằm trong một chuỗi không có mã hóa được đưa ra, vì mã hóa dự định sẽ không rõ ràng. Để biết thêm về điều đó, hãy xem hướng dẫn sử dụng Unicode trong tài liệu và PEP 263
str
chữVì vậy, chúng ta cần một unicode
chuỗi để xử lý việc chuyển đổi này, được thực hiện dễ dàng với một chuỗi ký tự unicode, định nghĩa bằng một u
tiền tố (và lưu ý u
tiền tố cũng hoạt động trong Python 3):
>>> unicode_literal = u'Километр'
>>> print(unicode_literal.lower())
километр
Lưu ý rằng các byte hoàn toàn khác với các str
byte - ký tự thoát được '\u'
theo sau bởi độ rộng 2 byte hoặc biểu diễn 16 bit của các unicode
chữ cái này :
>>> unicode_literal
u'\u041a\u0438\u043b\u043e\u043c\u0435\u0442\u0440'
>>> unicode_literal.lower()
u'\u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440'
Bây giờ nếu chúng ta chỉ có nó ở dạng a str
, chúng ta cần chuyển đổi nó thành unicode
. Kiểu Unicode của Python là một định dạng mã hóa phổ quát có nhiều ưu điểm so với hầu hết các bảng mã khác. Chúng ta có thể sử dụng hàm unicode
tạo hoặc str.decode
phương thức với codec để chuyển đổi str
thành 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
Cả hai phương thức đều chuyển đổi sang loại unicode - và giống như unicode_literal.
Bạn nên luôn luôn làm việc với văn bản bằng Unicode .
Phần mềm chỉ nên hoạt động với các chuỗi Unicode bên trong, chuyển đổi thành một mã hóa cụ thể trên đầu ra.
Tuy nhiên, để lấy lại chữ thường str
, hãy mã hóa chuỗi python thành utf-8
lại:
>>> 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')
километр
Vì vậy, trong Python 2, Unicode có thể mã hóa thành các chuỗi Python và các chuỗi Python có thể giải mã thành loại Unicode.
Với Python 2, điều này không hoạt động đối với các từ không phải tiếng Anh trong UTF-8. Trong trường hợp này decode('utf-8')
có thể giúp:
>>> s='Километр'
>>> print s.lower()
Километр
>>> print s.decode('utf-8').lower()
километр
decode('utf-8')
này không chỉ không cần thiết trong Python 3, mà còn gây ra lỗi. (tham khảo ). Ví dụ: $python3; >>>s='Километр'; >>>print (s.lower); #result: километр >>>s.decode('utf-8').lower(); #result: ...AttributeError: 'str' object has no attribute 'decode'
Chúng ta có thể thấy một cách thứ hai để làm điều này, tham khảo câu trả lời tuyệt vời của @AaronHall. >>>s.casefold() #result: километр
Ngoài ra, bạn có thể ghi đè lên một số biến:
s = input('UPPER CASE')
lower = s.lower()
Nếu bạn sử dụng như thế này:
s = "Kilometer"
print(s.lower()) - kilometer
print(s) - Kilometer
Nó sẽ hoạt động ngay khi được gọi.
s=s.lower()
là con đường để đi
Đừng thử điều này, hoàn toàn không khuyến nghị, đừng làm điều này:
import string
s='ABCD'
print(''.join([string.ascii_lowercase[string.ascii_uppercase.index(i)] for i in s]))
Đầu ra:
abcd
Vì không ai viết nó nhưng bạn có thể sử dụng swapcase
(vì vậy chữ in hoa sẽ trở thành chữ thường và ngược lại) (và cái này bạn nên sử dụng trong trường hợp tôi vừa đề cập (chuyển từ trên sang dưới, dưới thành trên)):
s='ABCD'
print(s.swapcase())
Đầu ra:
abcd
>>> "raison d'être".casefold(); "raison d'être"
Kiểm tra câu trả lời này vềunidecode