Làm cách nào để viết thường một chuỗi trong Python?


2056

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:



259

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 .

Unicode Python 3

Python 3 xử lý các chuỗi ký tự đơn giản là unicode:

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

Python 2, chuỗi ký tự đơn giản là byte

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.

lowerkhô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ệuPEP 263

Sử dụng chữ Unicode, không phải strchữ

Vì vậy, chúng ta cần một unicodechuỗ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 utiền tố (và lưu ý utiề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 strbyte - 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 unicodechữ 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 unicodetạo hoặc str.decodephương thức với codec để chuyển đổi strthà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.

Thực hành tốt nhất, sử dụng Unicode

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.

Có thể mã hóa trở lại khi cần thiết

Tuy nhiên, để lấy lại chữ thường str, hãy mã hóa chuỗi python thành utf-8lạ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.


Tôi có một lưu ý rằng không nhất thiết phải áp dụng cho câu hỏi của OP, nhưng điều này rất quan trọng với tính di động (quốc tế hóa) khi thực hiện khớp không nhạy cảm. Với kết hợp không phân biệt chữ hoa chữ thường, dấu phụ (dấu trọng âm) có thể trở thành mối quan tâm. Ví dụ: >>> "raison d'être".casefold(); "raison d'être"Kiểm tra câu trả lời này vềunidecode
bballdave025

198

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

8
Có lẽ chúng ta nên rõ ràng hơn một chút bằng cách nói rằng điều 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: километр
bballdave025

20

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.


10
Câu hỏi là làm thế nào để chuyển đổi chuỗi thành chữ thường. Làm thế nào câu trả lời này có rất nhiều phiếu bầu?
Munim Munna

1
s=s.lower()là con đường để đi
m00lti

1

Đừ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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.