string --- Các thao tác chuỗi phổ biến¶
Source code: Lib/string/__init__.py
Hằng chuỗi¶
Các hằng số được xác định trong mô-đun này là:
- string.ascii_letters¶
Sự kết hợp của các hằng số
ascii_lowercasevàascii_uppercaseđược mô tả bên dưới. Giá trị này không phụ thuộc vào miền địa phương.
- string.ascii_lowercase¶
Các chữ cái viết thường
'abcdefghijklmnopqrstuvwxyz'. Giá trị này không phụ thuộc vào miền địa phương và sẽ không thay đổi.
- string.ascii_uppercase¶
Các chữ in hoa
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. Giá trị này không phụ thuộc vào miền địa phương và sẽ không thay đổi.
- string.digits¶
Chuỗi
'0123456789'.
- string.hexdigits¶
Chuỗi
'0123456789abcdefABCDEF'.
- string.octdigits¶
Chuỗi
'01234567'.
- string.punctuation¶
Chuỗi ký tự ASCII được coi là ký tự dấu chấm câu trong ngôn ngữ
C:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~.
- string.printable¶
Chuỗi ký tự ASCII được Python coi là có thể in được. Đây là sự kết hợp của
digits,ascii_letters,punctuationvàwhitespace.Ghi chú
Theo thiết kế,
string.printable.isprintable()trả vềFalse. Đặc biệt,string.printablekhông thể in được theo nghĩa POSIX (xem LC_CTYPE).
- string.whitespace¶
Một chuỗi chứa tất cả các ký tự ASCII được coi là khoảng trắng. Điều này bao gồm không gian ký tự, tab, nguồn cấp dữ liệu, trả về, nguồn cấp dữ liệu và tab dọc.
Định dạng chuỗi tùy chỉnh¶
Lớp chuỗi tích hợp cung cấp khả năng thực hiện các thay thế biến phức tạp và định dạng giá trị thông qua phương thức format() được mô tả trong PEP 3101. Lớp Formatter trong mô-đun string cho phép bạn tạo và tùy chỉnh các hành vi định dạng chuỗi của riêng mình bằng cách sử dụng cách triển khai tương tự như phương thức format() tích hợp sẵn.
- class string.Formatter¶
Lớp
Formattercó các phương thức công khai sau:- format(format_string, /, *args, **kwargs)¶
Phương pháp API chính. Nó lấy một chuỗi định dạng và một tập hợp các đối số từ khóa và vị trí tùy ý. Nó chỉ là một trình bao bọc gọi
vformat().Thay đổi trong phiên bản 3.7: Đối số chuỗi định dạng hiện là positional-only.
- vformat(format_string, args, kwargs)¶
Chức năng này thực hiện công việc định dạng thực tế. Nó được hiển thị dưới dạng một hàm riêng biệt cho các trường hợp bạn muốn chuyển vào một từ điển đối số được xác định trước, thay vì giải nén và đóng gói lại từ điển dưới dạng các đối số riêng lẻ bằng cú pháp
*argsvà**kwargs.vformat()thực hiện công việc chia chuỗi định dạng thành dữ liệu ký tự và các trường thay thế. Nó gọi các phương pháp khác nhau được mô tả dưới đây.
Ngoài ra,
Formatterđịnh nghĩa một số phương thức được dự định sẽ được thay thế bởi các lớp con:- parse(format_string)¶
Lặp lại chuỗi format_string và trả về một bộ dữ liệu có thể lặp lại (literal_text, field_name, format_spec, conversion). Điều này được
vformat()sử dụng để ngắt chuỗi thành văn bản bằng chữ hoặc các trường thay thế.Các giá trị trong bộ dữ liệu về mặt khái niệm biểu thị một khoảng văn bản bằng chữ theo sau là một trường thay thế duy nhất. Nếu không có văn bản bằng chữ (điều này có thể xảy ra nếu hai trường thay thế xuất hiện liên tiếp), thì literal_text sẽ là một chuỗi có độ dài bằng 0. Nếu không có trường thay thế thì các giá trị của field_name, format_spec và conversion sẽ là
None. Giá trị của field_name không được sửa đổi và việc tự động đánh số các trường vị trí không được đánh số được thực hiện bởivformat().
- get_field(field_name, args, kwargs)¶
Cho field_name, chuyển đổi nó thành đối tượng cần định dạng. Việc tự động đánh số field_name được trả về từ
parse()được thực hiện bởivformat()trước khi gọi phương thức này. Trả về một bộ dữ liệu (obj, used_key). Phiên bản mặc định lấy các chuỗi có dạng được xác định trong PEP 3101, chẳng hạn như "0[name]" hoặc "label.title". args và kwargs được chuyển vàovformat(). Giá trị trả về used_key có cùng ý nghĩa với tham số key đối vớiget_value().
- get_value(key, args, kwargs)¶
Truy xuất một giá trị trường nhất định. Đối số key sẽ là số nguyên hoặc chuỗi. Nếu là số nguyên, nó biểu thị chỉ mục của đối số vị trí trong args; nếu nó là một chuỗi thì nó đại diện cho một đối số được đặt tên trong kwargs.
Tham số args được đặt thành danh sách các đối số vị trí thành
vformat()và tham số kwargs được đặt thành từ điển của các đối số từ khóa.Đối với tên trường ghép, các hàm này chỉ được gọi cho thành phần đầu tiên của tên trường; các thành phần tiếp theo được xử lý thông qua các hoạt động lập chỉ mục và thuộc tính thông thường.
Vì vậy, ví dụ: biểu thức trường '0.name' sẽ khiến
get_value()được gọi với đối số key là 0. Thuộc tínhnamesẽ được tra cứu sau khiget_value()trả về bằng cách gọi hàmgetattr()tích hợp sẵn.Nếu chỉ mục hoặc từ khóa đề cập đến một mục không tồn tại thì
IndexErrorhoặcKeyErrorsẽ được nâng lên.
- check_unused_args(used_args, args, kwargs)¶
Thực hiện kiểm tra các đối số không sử dụng nếu muốn. Các đối số cho hàm này là tập hợp tất cả các khóa đối số thực sự được tham chiếu trong chuỗi định dạng (số nguyên cho đối số vị trí và chuỗi cho đối số được đặt tên) và tham chiếu đến args và kwargs đã được chuyển đến vformat. Tập hợp các đối số không được sử dụng có thể được tính toán từ các tham số này.
check_unused_args()được cho là sẽ đưa ra một ngoại lệ nếu việc kiểm tra không thành công.
- format_field(value, format_spec)¶
format_field()chỉ đơn giản gọiformat()tích hợp toàn cầu. Phương thức này được cung cấp để các lớp con có thể ghi đè lên nó.
- convert_field(value, conversion)¶
Chuyển đổi giá trị (được trả về bởi
get_field()) cho một loại chuyển đổi (như trong bộ dữ liệu được trả về bởi phương thứcparse()). Phiên bản mặc định hiểu các loại chuyển đổi 's' (str), 'r' (repr) và 'a' (ascii).
Cú pháp định dạng chuỗi¶
Phương thức str.format() và lớp Formatter chia sẻ cùng một cú pháp cho chuỗi định dạng (mặc dù trong trường hợp Formatter, các lớp con có thể xác định cú pháp chuỗi định dạng của riêng chúng). Cú pháp có liên quan đến cú pháp của formatted string literals và template string literals, nhưng nó ít phức tạp hơn và đặc biệt là không hỗ trợ các biểu thức tùy ý trong phép nội suy.
Chuỗi định dạng chứa "trường thay thế" được bao quanh bởi dấu ngoặc nhọn {}. Bất kỳ nội dung nào không nằm trong dấu ngoặc nhọn đều được coi là văn bản chữ, được sao chép không thay đổi vào đầu ra. Nếu bạn cần bao gồm ký tự dấu ngoặc nhọn trong văn bản bằng chữ, bạn có thể thoát ký tự này bằng cách nhân đôi: {{ và }}.
Ngữ pháp cho trường thay thế như sau:
replacement_field: "{" [field_name] ["!"conversion] [":"format_spec] "}" field_name:arg_name("."attribute_name| "["element_index"]")* arg_name: [identifier|digit+] attribute_name:identifierelement_index:digit+ |index_stringindex_string: <any source character except "]"> + conversion: "r" | "s" | "a" format_spec:format-spec:format_spec
Theo thuật ngữ ít trang trọng hơn, trường thay thế có thể bắt đầu bằng field_name chỉ định đối tượng có giá trị được định dạng và chèn vào đầu ra thay vì trường thay thế. Theo sau field_name là trường conversion, trước là dấu chấm than '!' và format_spec, đứng trước dấu hai chấm ':'. Chúng chỉ định định dạng không mặc định cho giá trị thay thế.
Xem thêm phần Đặc tả định dạng ngôn ngữ nhỏ.
Bản thân field_name bắt đầu bằng arg_name là số hoặc từ khóa. Nếu là một số, thì nó đề cập đến một đối số vị trí và nếu là một từ khóa, nó sẽ đề cập đến một đối số từ khóa được đặt tên. Một arg_name được coi là một số nếu lệnh gọi tới str.isdecimal() trên chuỗi trả về true. Nếu các arg_name số trong chuỗi định dạng là 0, 1, 2, ... theo thứ tự, thì tất cả chúng đều có thể bị bỏ qua (không chỉ một số) và các số 0, 1, 2, ... sẽ được tự động chèn vào theo thứ tự đó. Vì arg_name không được phân cách bằng dấu ngoặc kép nên không thể chỉ định các khóa từ điển tùy ý (ví dụ: chuỗi '10' hoặc ':-]') trong chuỗi định dạng. Theo sau arg_name có thể có bất kỳ số lượng biểu thức chỉ mục hoặc thuộc tính nào. Một biểu thức có dạng '.name' chọn thuộc tính được đặt tên bằng getattr(), trong khi một biểu thức có dạng '[index]' thực hiện tra cứu chỉ mục bằng __getitem__().
Thay đổi trong phiên bản 3.1: Các bộ xác định đối số vị trí có thể được bỏ qua cho str.format(), vì vậy '{} {}'.format(a, b) tương đương với '{0} {1}'.format(a, b).
Thay đổi trong phiên bản 3.4: Các chỉ định đối số vị trí có thể được bỏ qua cho Formatter.
Một số ví dụ về chuỗi định dạng đơn giản
"Đầu tiên, bạn phải tính đến {0}" # References đối số vị trí đầu tiên
"Mang cho tôi một {}" # Implicitly tham chiếu đối số vị trí đầu tiên
"Từ {} đến {}" # Same là "Từ {0} đến {1}"
"Nhiệm vụ của tôi là {name}" đối số từ khóa # References 'name'
Thuộc tính "Trọng lượng tính bằng tấn {0.weight}" # 'trọng lượng' của đối số vị trí đầu tiên
"Các đơn vị bị phá hủy: {players[0]}" phần tử # First của đối số từ khóa 'người chơi'.
Trường conversion gây ra sự ép buộc kiểu trước khi định dạng. Thông thường, công việc định dạng một giá trị được thực hiện bằng phương thức __format__() của chính giá trị đó. Tuy nhiên, trong một số trường hợp, nên buộc một kiểu được định dạng dưới dạng một chuỗi, ghi đè định nghĩa định dạng của chính nó. Bằng cách chuyển đổi giá trị thành chuỗi trước khi gọi __format__(), logic định dạng thông thường sẽ bị bỏ qua.
Hiện tại, ba cờ chuyển đổi được hỗ trợ: '!s' gọi str() theo giá trị, '!r' gọi repr() và '!a' gọi ascii().
Một số ví dụ:
"Harold là một người thông minh {0!s}" # Calls str() trong cuộc tranh luận đầu tiên
"Đưa ra {name!r} thánh" # Calls repr() trong cuộc tranh luận trước
"Thêm {!a}" # Calls ascii() về đối số trước
Trường format_spec chứa thông số kỹ thuật về cách trình bày giá trị, bao gồm các chi tiết như độ rộng trường, căn chỉnh, phần đệm, độ chính xác thập phân, v.v. Mỗi loại giá trị có thể xác định "ngôn ngữ nhỏ định dạng" hoặc cách diễn giải format_spec của riêng nó.
Hầu hết các loại tích hợp đều hỗ trợ một ngôn ngữ nhỏ định dạng phổ biến, được mô tả trong phần tiếp theo.
Trường format_spec cũng có thể bao gồm các trường thay thế lồng nhau trong đó. Các trường thay thế lồng nhau này có thể chứa tên trường, cờ chuyển đổi và đặc tả định dạng, nhưng không được phép lồng sâu hơn. Các trường thay thế trong format_spec được thay thế trước khi chuỗi format_spec được diễn giải. Điều này cho phép định dạng của một giá trị được chỉ định động.
Xem phần Ví dụ về định dạng để biết một số ví dụ.
Đặc tả định dạng ngôn ngữ nhỏ¶
"Thông số định dạng" được sử dụng trong các trường thay thế có trong chuỗi định dạng để xác định cách trình bày các giá trị riêng lẻ (xem Cú pháp định dạng chuỗi, dây f và dây chữ T). Chúng cũng có thể được chuyển trực tiếp đến hàm format() tích hợp. Mỗi loại có thể định dạng có thể xác định cách diễn giải đặc tả định dạng.
Hầu hết các loại cài sẵn đều triển khai các tùy chọn sau cho thông số định dạng, mặc dù một số tùy chọn định dạng chỉ được hỗ trợ bởi các loại số.
Quy ước chung là đặc tả định dạng trống sẽ tạo ra kết quả tương tự như khi bạn gọi str() trên giá trị. Đặc tả định dạng không trống thường sửa đổi kết quả.
Dạng chung của standard format specifier là:
format_spec: [options][width_and_precision][type] options: [[fill]align][sign]["z"]["#"]["0"] fill: <any character> align: "<" | ">" | "=" | "^" sign: "+" | "-" | " " width_and_precision: [width_with_grouping][precision_with_grouping] width_with_grouping: [width][grouping] precision_with_grouping: "." [precision][grouping] | "."groupingwidth:digit+ precision:digit+ grouping: "," | "_" type: "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
Nếu một giá trị align hợp lệ được chỉ định, thì giá trị đó có thể được đặt trước bởi một ký tự fill có thể là bất kỳ ký tự nào và mặc định là khoảng trắng nếu bị bỏ qua. Không thể sử dụng dấu ngoặc nhọn ("{" hoặc "}") làm ký tự fill trong formatted string literal hoặc khi sử dụng phương thức str.format(). Tuy nhiên, có thể chèn dấu ngoặc nhọn bằng trường thay thế lồng nhau. Hạn chế này không ảnh hưởng đến chức năng format().
Ý nghĩa của các tùy chọn căn chỉnh khác nhau như sau:
Tùy chọn |
Ý nghĩa |
|---|---|
|
Buộc trường được căn trái trong khoảng trống có sẵn (đây là cài đặt mặc định cho hầu hết các đối tượng). |
|
Buộc trường được căn phải trong khoảng trống có sẵn (đây là mặc định cho số). |
|
Buộc phần đệm được đặt sau dấu (nếu có) nhưng trước các chữ số. Điều này được sử dụng để in các trường ở dạng '+000000120'. Tùy chọn căn chỉnh này chỉ hợp lệ cho các loại số, ngoại trừ |
|
Buộc trường phải được căn giữa trong không gian có sẵn. |
Lưu ý rằng trừ khi độ rộng trường tối thiểu được xác định, độ rộng trường sẽ luôn có cùng kích thước với dữ liệu cần điền vào, do đó tùy chọn căn chỉnh không có ý nghĩa gì trong trường hợp này.
Tùy chọn sign chỉ hợp lệ cho các loại số và có thể là một trong các loại sau:
Tùy chọn |
Ý nghĩa |
|---|---|
|
Cho biết rằng một dấu hiệu nên được sử dụng cho cả số dương và số âm. |
|
Cho biết rằng chỉ nên sử dụng dấu cho số âm (đây là hành vi mặc định). |
không gian |
Cho biết rằng nên sử dụng khoảng trắng ở đầu đối với số dương và dấu trừ đối với số âm. |
Tùy chọn 'z' ép các giá trị dấu phẩy động số 0 âm thành số 0 dương sau khi làm tròn đến độ chính xác định dạng. Tùy chọn này chỉ hợp lệ cho các kiểu trình bày dấu phẩy động.
Thay đổi trong phiên bản 3.11: Đã thêm tùy chọn 'z' (xem thêm PEP 682).
Tùy chọn '#' khiến "dạng thay thế" được sử dụng để chuyển đổi. Hình thức thay thế được xác định khác nhau cho các loại khác nhau. Tùy chọn này chỉ hợp lệ cho các kiểu số nguyên, số float và số phức. Đối với số nguyên, khi sử dụng đầu ra nhị phân, bát phân hoặc thập lục phân, tùy chọn này sẽ thêm tiền tố tương ứng '0b', '0o', '0x' hoặc '0X' vào giá trị đầu ra. Đối với float và complex, dạng thay thế khiến kết quả chuyển đổi luôn chứa ký tự dấu thập phân, ngay cả khi không có chữ số nào theo sau nó. Thông thường, ký tự dấu thập phân chỉ xuất hiện trong kết quả của những chuyển đổi này nếu có một chữ số theo sau nó. Ngoài ra, đối với các chuyển đổi 'g' và 'G', các số 0 ở cuối sẽ không bị xóa khỏi kết quả.
width là số nguyên thập phân xác định tổng chiều rộng trường tối thiểu, bao gồm mọi tiền tố, dấu phân cách và các ký tự định dạng khác. Nếu không được chỉ định thì độ rộng trường sẽ được xác định bởi nội dung.
Khi không căn chỉnh rõ ràng, trước trường width bằng ký tự 0 ('0') sẽ bật đệm 0 nhận biết dấu hiệu cho các loại số, ngoại trừ complex. Điều này tương đương với ký tự fill của '0' với loại alignment của '='.
Thay đổi trong phiên bản 3.10: Trước trường width bằng '0' không còn ảnh hưởng đến căn chỉnh mặc định cho chuỗi.
precision là số nguyên thập phân cho biết có bao nhiêu chữ số sẽ được hiển thị sau dấu thập phân đối với loại bản trình bày 'f' và 'F' hoặc trước và sau dấu thập phân đối với loại bản trình bày 'g' hoặc 'G'. Đối với các kiểu trình bày chuỗi, trường cho biết kích thước trường tối đa - nói cách khác, số lượng ký tự sẽ được sử dụng từ nội dung trường. Zz005zz không được phép đối với các kiểu trình bày số nguyên.
Tùy chọn grouping sau các trường width và precision chỉ định dấu tách nhóm chữ số cho phần nguyên và phần phân số tương ứng của một số. Nó có thể là một trong những điều sau đây:
Tùy chọn |
Ý nghĩa |
|---|---|
|
Chèn một dấu phẩy mỗi 3 chữ số cho kiểu trình bày số nguyên |
|
Chèn một dấu gạch dưới mỗi 3 chữ số cho kiểu trình bày số nguyên |
Để có dấu phân cách nhận biết ngôn ngữ, thay vào đó hãy sử dụng loại bản trình bày 'n'.
Thay đổi trong phiên bản 3.1: Đã thêm tùy chọn ',' (xem thêm PEP 378).
Thay đổi trong phiên bản 3.6: Đã thêm tùy chọn '_' (xem thêm PEP 515).
Thay đổi trong phiên bản 3.14: Hỗ trợ tùy chọn grouping cho phần phân số.
Cuối cùng, type xác định cách trình bày dữ liệu.
Các kiểu trình bày chuỗi có sẵn là:
Loại
Ý nghĩa
's'Định dạng chuỗi. Đây là loại mặc định cho chuỗi và có thể được bỏ qua.
không có
Tương tự với
's'
Các kiểu trình bày số nguyên có sẵn là:
Loại
Ý nghĩa
'b'Định dạng nhị phân. Xuất ra số ở cơ số 2.
'c'Nhân vật. Chuyển đổi số nguyên thành ký tự unicode tương ứng trước khi in.
'd'Số nguyên thập phân. Xuất ra số trong cơ số 10.
'o'Định dạng bát phân. Xuất ra số trong cơ số 8.
'x'Định dạng hex. Xuất ra số trong cơ số 16, sử dụng chữ cái viết thường cho các chữ số trên 9.
'X'Định dạng hex. Xuất số trong cơ số 16, sử dụng chữ in hoa cho các chữ số trên 9. Trong trường hợp
'#'được chỉ định, tiền tố'0x'cũng sẽ được viết hoa thành'0X'.
'n'Số. Điều này giống như
'd', ngoại trừ việc nó sử dụng cài đặt ngôn ngữ hiện tại để chèn dấu phân cách nhóm chữ số thích hợp.không có
Tương tự với
'd'
Ngoài các kiểu trình bày trên, số nguyên có thể được định dạng bằng các kiểu trình bày dấu phẩy động được liệt kê bên dưới (ngoại trừ 'n' và None). Khi làm như vậy, float() được sử dụng để chuyển đổi số nguyên thành số có dấu phẩy động trước khi định dạng.
Các loại bản trình bày có sẵn cho các giá trị float và Decimal là:
Loại
Ý nghĩa
'e'Ký hiệu khoa học. Đối với độ chính xác nhất định
p, hãy định dạng số theo ký hiệu khoa học bằng chữ 'e' ngăn cách hệ số với số mũ. Hệ số có một chữ số ở trước và các chữ sốpsau dấu thập phân, tạo nên tổng số các chữ số có nghĩap + 1. Không có độ chính xác nhất định, sử dụng độ chính xác của các chữ số6sau dấu thập phân chofloatvà hiển thị tất cả các chữ số hệ số choDecimal. Nếup=0, dấu thập phân sẽ bị bỏ qua trừ khi tùy chọn#được sử dụng.Đối với
float, số mũ luôn chứa ít nhất hai chữ số và bằng 0 nếu giá trị bằng 0.
'E'Ký hiệu khoa học. Tương tự như
'e'ngoại trừ nó sử dụng chữ hoa 'E' làm ký tự phân cách.
'f'Ký hiệu điểm cố định. Đối với
pcó độ chính xác nhất định, hãy định dạng số dưới dạng số thập phân với các chữ sốpchính xác theo sau dấu thập phân. Không có độ chính xác nhất định, sử dụng độ chính xác của các chữ số6sau dấu thập phân chofloatvà sử dụng độ chính xác đủ lớn để hiển thị tất cả các chữ số hệ số choDecimal. Nếup=0, dấu thập phân sẽ bị bỏ qua trừ khi tùy chọn#được sử dụng.
'F'Ký hiệu điểm cố định. Tương tự như
'f', nhưng chuyển đổinanthànhNANvàinfthànhINF.
'g'Định dạng chung. Đối với
p >= 1có độ chính xác nhất định, thao tác này làm tròn số thành các chữ số có nghĩap, sau đó định dạng kết quả ở định dạng điểm cố định hoặc theo ký hiệu khoa học, tùy thuộc vào độ lớn của nó. Độ chính xác của0được coi là tương đương với độ chính xác của1.Các quy tắc chính xác như sau: giả sử rằng kết quả được định dạng với kiểu trình bày
'e'và độ chính xácp-1sẽ có số mũexp. Sau đó, nếum <= exp < p, trong đómlà -4 đối với số float và -6 đối vớiDecimals, thì số được định dạng với loại bản trình bày'f'và độ chính xácp-1-exp. Nếu không, số sẽ được định dạng với kiểu trình bày'e'và độ chính xácp-1. Trong cả hai trường hợp, các số 0 ở cuối không đáng kể sẽ bị xóa khỏi phần có nghĩa và dấu thập phân cũng bị xóa nếu không còn chữ số nào theo sau nó, trừ khi tùy chọn'#'được sử dụng.Không có độ chính xác nhất định, sử dụng độ chính xác của các chữ số có nghĩa
6chofloat. Đối vớiDecimal, hệ số của kết quả được hình thành từ các chữ số hệ số của giá trị; ký hiệu khoa học được sử dụng cho các giá trị nhỏ hơn1e-6về giá trị tuyệt đối và các giá trị trong đó giá trị vị trí của chữ số có nghĩa nhỏ nhất lớn hơn 1 và ký hiệu điểm cố định được sử dụng theo cách khác.Vô cực dương và âm, số 0 dương và âm và nans, được định dạng lần lượt là
inf,-inf,0,-0vànan, bất kể độ chính xác như thế nào.
'G'Định dạng chung. Tương tự như
'g'ngoại trừ việc chuyển sang'E'nếu số lượng quá lớn. Các biểu diễn của vô cực và NaN cũng được viết hoa.
'n'Số. Điều này tương tự như
'g', ngoại trừ việc nó sử dụng cài đặt ngôn ngữ hiện tại để chèn dấu phân tách nhóm chữ số thích hợp cho phần nguyên của một số.
'%'Tỷ lệ phần trăm. Nhân số với 100 và hiển thị ở định dạng cố định (
'f'), theo sau là dấu phần trăm.không có
Đối với
float, loại này giống như loại'g', ngoại trừ việc khi sử dụng ký hiệu điểm cố định để định dạng kết quả, nó luôn bao gồm ít nhất một chữ số sau dấu thập phân và chuyển sang ký hiệu khoa học khiexp >= p - 1. Khi độ chính xác không được chỉ định, giá trị sau sẽ lớn đến mức cần thiết để thể hiện một cách trung thực giá trị đã cho.Đối với
Decimal, giá trị này giống với'g'hoặc'G'tùy thuộc vào giá trị củacontext.capitalscho ngữ cảnh thập phân hiện tại.Hiệu ứng tổng thể là khớp với đầu ra của
str()được thay đổi bởi các công cụ sửa đổi định dạng khác.
Kết quả phải được làm tròn chính xác đến độ chính xác nhất định là p gồm các chữ số sau dấu thập phân. Chế độ làm tròn cho float khớp với chế độ làm tròn của round(). Đối với Decimal, chế độ làm tròn của context hiện tại sẽ được sử dụng.
Các loại bản trình bày có sẵn cho complex cũng giống như các loại bản trình bày cho float ('%' không được phép). Cả thành phần thực và ảo của số phức đều được định dạng dưới dạng số dấu phẩy động, theo kiểu trình bày đã chỉ định. Chúng được phân tách bằng dấu bắt buộc của phần ảo, phần sau được kết thúc bằng hậu tố j. Nếu loại bản trình bày bị thiếu, kết quả sẽ khớp với đầu ra của str() (các số phức có phần thực khác 0 cũng được bao quanh bởi dấu ngoặc đơn), có thể bị thay đổi bởi các công cụ sửa đổi định dạng khác.
Ví dụ về định dạng¶
Phần này chứa các ví dụ về cú pháp str.format() và so sánh với định dạng % cũ.
Trong hầu hết các trường hợp, cú pháp tương tự như định dạng % cũ, với việc bổ sung {} và sử dụng : thay vì %. Ví dụ: '%03.2f' có thể được dịch sang '{:03.2f}'.
Cú pháp định dạng mới cũng hỗ trợ các tùy chọn mới và khác nhau, được hiển thị trong các ví dụ sau.
Truy cập đối số theo vị trí:
>>> '{0}, {1}, {2}'.format('a', 'b', 'c')
'a, b, c'
>>> '{}, {}, {}'.format('a', 'b', 'c') # 3.1+ chỉ
'a, b, c'
>>> '{2}, {1}, {0}'.format('a', 'b', 'c')
'c, b, a'
>>> '{2}, {1}, {0}'.format(*'abc') chuỗi đối số # unpacking
'c, b, a'
>>> Các chỉ mục '{0}{1}{0}'.format('abra', 'cad') # arguments' có thể được lặp lại
'abracadabra'
Truy cập các đối số theo tên:
>>> ' Tọa độ: {vĩ độ}, {kinh độ}'.format(latitude='37.24N', kinh độ='-115.81W')
'Tọa độ: 37,24N, -115,81W'
>>> tọa độ = {'vĩ độ': '37,24N', 'kinh độ': '-115,81W'}
>>> 'Toạ độ: {latitude}, {longitude}'.format(**coord)
'Tọa độ: 37,24N, -115,81W'
Truy cập các thuộc tính của đối số
>>> c = 3-5j
>>> ('Số phức {0} được hình thành từ phần thực {0.real}'
... 'và phần ảo {0.imag}.').format(c)
'Số phức (3-5j) được hình thành từ phần thực 3.0 và phần ảo -5.0.'
>>> Điểm lớp:
... def __init__(self, x, y):
... self.x, self.y = x, y
... def __str__(tự):
... return 'Điểm({self.x}, {self.y})'.format(self=self)
...
>>> str(Điểm(4, 2))
'Điểm(4, 2)'
Truy cập các mục của đối số:
>>> tọa độ = (3, 5)
>>> 'X: {0[0]}; Y: {0[1]}'.format(coord)
'X: 3; Y: 5'
Thay thế %s và %r:
>>> "repr() hiển thị dấu ngoặc kép: {!r}; str() không hiển thị: {!s}".format('test1', 'test2')
"repr() hiển thị dấu ngoặc kép: 'test1'; str() không: test2"
Căn chỉnh văn bản và chỉ định chiều rộng:
>>> '{:<30}'.format('căn lề trái')
'căn trái'
>>> '{:>30}'.format('căn phải')
' căn phải'
>>> '{:^30}'.format('centered')
'trung tâm'
>>> '{:*^30}'.format('centered') # use '*' làm ký tự điền
'*********zz000zz*********'
Thay thế %+f, %-f và % f và chỉ định một dấu hiệu:
>>> '{:+f}; {:+f}'.format(3.14, -3.14) # show luôn đó
'+3,140000; -3.140000'
>>> '{: f}; {: f}'.format(3.14, -3.14) # show khoảng trắng cho số dương
' 3,140000; -3.140000'
>>> '{:-f}; {:-f}'.format(3.14, -3.14) # show chỉ là điểm trừ -- giống như '{:f}; {:f}'
'3.140000; -3.140000'
Thay thế %x và %o và chuyển đổi giá trị sang các cơ sở khác nhau
>>> # format cũng hỗ trợ số nhị phân
>>> "int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(42)
'int: 42; thập lục phân: 2a; tháng 10: 52; thùng: 101010'
>>> # with 0x, 0o hoặc 0b làm tiền tố:
>>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(42)
'int: 42; thập lục phân: 0x2a; tháng 10: 0o52; thùng rác: 0b101010'
Sử dụng dấu phẩy hoặc dấu gạch dưới làm dấu tách nhóm chữ số:
>>> '{:,}'.format(1234567890)
'1.234.567.890'
>>> '{:_}'.format(1234567890)
'1_234_567_890'
>>> '{:_b}'.format(1234567890)
'100_1001_1001_0110_0000_0010_1101_0010'
>>> '{:_x}'.format(1234567890)
'4996_02d2'
>>> '{:_}'.format(123456789.123456789)
'123_456_789.12345679'
>>> '{:.,}'.format(123456789.123456789)
'123456789.123,456,79'
>>> '{:,._}'.format(123456789.123456789)
'123,456,789.123_456_79'
Biểu thị tỷ lệ phần trăm:
>>> điểm = 19
>>> tổng cộng = 22
>>> 'Câu trả lời đúng: {:.2%}'.format(điểm/tổng)
'Câu trả lời đúng: 86,36%'
Sử dụng định dạng dành riêng cho loại
>>> nhập ngày giờ dưới dạng dt
>>> d = dt.datetime(2010, 7, 4, 12, 15, 58)
>>> '{:%Y-%m-%d %H:%M:%S}'.format(d)
'2010-07-04 12:15:58'
Các đối số lồng nhau và các ví dụ phức tạp hơn:
>>> for align, text in zip('<^>', ['left', 'center', 'right']):
... '{0:{fill}{align}16}'.format(text, fill=align, align=align)
...
'left<<<<<<<<<<<<'
'^^^^^center^^^^^'
'>>>>>>>>>>>right'
>>>
>>> octets = [192, 168, 0, 1]
>>> '{:02X}{:02X}{:02X}{:02X}'.format(*octets)
'C0A80001'
>>> int(_, 16)
3232235521
>>>
>>> width = 5
>>> for num in range(5,12):
... for base in 'dXob':
... print('{0:{width}{base}}'.format(num, base=base, width=width), end=' ')
... print()
...
5 5 5 101
6 6 6 110
7 7 7 111
8 8 10 1000
9 9 11 1001
10 A 12 1010
11 B 13 1011
Chuỗi mẫu ($-chuỗi)¶
Ghi chú
Tính năng được mô tả ở đây đã được giới thiệu trong Python 2.4; một phương pháp tạo khuôn mẫu đơn giản dựa trên các biểu thức chính quy. Nó có trước str.format(), formatted string literals và template string literals.
Nó không liên quan đến chuỗi ký tự mẫu (chuỗi t), được giới thiệu trong Python 3.14. Chúng đánh giá các đối tượng string.templatelib.Template, được tìm thấy trong mô-đun string.templatelib.
Chuỗi mẫu cung cấp khả năng thay thế chuỗi đơn giản hơn như được mô tả trong PEP 292. Trường hợp sử dụng chính của chuỗi mẫu là để quốc tế hóa (i18n) vì trong ngữ cảnh đó, cú pháp và chức năng đơn giản hơn giúp dịch dễ dàng hơn các phương tiện định dạng chuỗi tích hợp khác trong Python. Để làm ví dụ về thư viện được xây dựng trên chuỗi mẫu cho i18n, hãy xem gói flufl.i18n.
Chuỗi mẫu hỗ trợ thay thế dựa trên $, sử dụng các quy tắc sau:
$$là một lối thoát; nó được thay thế bằng một$duy nhất.$identifierđặt tên cho trình giữ chỗ thay thế khớp với khóa ánh xạ của"identifier". Theo mặc định,"identifier"bị hạn chế ở bất kỳ chuỗi chữ và số ASCII không phân biệt chữ hoa chữ thường nào (bao gồm cả dấu gạch dưới) bắt đầu bằng dấu gạch dưới hoặc chữ cái ASCII. Ký tự không nhận dạng đầu tiên sau ký tự$chấm dứt thông số giữ chỗ này.${identifier}tương đương với$identifier. Nó được yêu cầu khi các ký tự định danh hợp lệ theo sau phần giữ chỗ nhưng không phải là một phần của phần giữ chỗ, chẳng hạn như"${noun}ification".
Bất kỳ sự xuất hiện nào khác của $ trong chuỗi sẽ dẫn đến việc ValueError được nâng lên.
Mô-đun string cung cấp lớp Template thực hiện các quy tắc này. Các phương pháp của Template là:
- class string.Template(template)¶
Hàm tạo lấy một đối số duy nhất là chuỗi mẫu.
- substitute(mapping={}, /, **kwds)¶
Thực hiện thay thế mẫu, trả về một chuỗi mới. mapping là bất kỳ đối tượng giống từ điển nào có khóa khớp với phần giữ chỗ trong mẫu. Ngoài ra, bạn có thể cung cấp các đối số từ khóa, trong đó từ khóa là phần giữ chỗ. Khi cả mapping và kwds đều được cung cấp và có các bản sao, phần giữ chỗ từ kwds sẽ được ưu tiên.
- safe_substitute(mapping={}, /, **kwds)¶
Giống như
substitute(), ngoại trừ việc nếu phần giữ chỗ bị thiếu trong mapping và kwds, thay vì đưa ra ngoại lệKeyError, phần giữ chỗ ban đầu sẽ xuất hiện nguyên vẹn trong chuỗi kết quả. Ngoài ra, không giống nhưsubstitute(), bất kỳ lần xuất hiện nào khác của$sẽ chỉ trả về$thay vì tăngValueError.Mặc dù các trường hợp ngoại lệ khác vẫn có thể xảy ra nhưng phương pháp này được gọi là "an toàn" vì nó luôn cố gắng trả về một chuỗi có thể sử dụng được thay vì đưa ra một ngoại lệ. Theo một nghĩa khác,
safe_substitute()có thể không an toàn vì nó sẽ âm thầm bỏ qua các mẫu không đúng định dạng chứa dấu phân cách lơ lửng, dấu ngoặc nhọn không khớp hoặc phần giữ chỗ không phải là mã định danh Python hợp lệ.
- is_valid()¶
Trả về
Falsenếu mẫu có phần giữ chỗ không hợp lệ sẽ khiếnsubstitute()tăngValueError.Added in version 3.11.
- get_identifiers()¶
Trả về danh sách số nhận dạng hợp lệ trong mẫu, theo thứ tự chúng xuất hiện lần đầu, bỏ qua mọi số nhận dạng không hợp lệ.
Added in version 3.11.
Các phiên bản
Templatecũng cung cấp một thuộc tính dữ liệu công khai:- template¶
Đây là đối tượng được truyền cho đối số template của hàm tạo. Nói chung, bạn không nên thay đổi nó, nhưng quyền truy cập chỉ đọc không được thực thi.
Dưới đây là ví dụ về cách sử dụng Mẫu:
>>> từ Mẫu nhập chuỗi
>>> s = Mẫu('$ai thích $cái gì')
>>> s.substitute(who='tim', what='kung pao')
'tim thích kung pao'
>>> d = dict(who='tim')
>>> Mẫu('Cho $ai $100').substitute(d)
Traceback (cuộc gọi gần đây nhất):
...
ValueError: Trình giữ chỗ không hợp lệ trong chuỗi: dòng 1, col 11
>>> Mẫu('$ai thích $cái gì').thay thế(d)
Traceback (cuộc gọi gần đây nhất):
...
KeyError: 'cái gì'
>>> Mẫu('$ai thích $what').safe_substitute(d)
'tim thích $cái gì'
Cách sử dụng nâng cao: bạn có thể lấy các lớp con của Template để tùy chỉnh cú pháp giữ chỗ, ký tự phân cách hoặc toàn bộ biểu thức chính quy được sử dụng để phân tích các chuỗi mẫu. Để thực hiện việc này, bạn có thể ghi đè các thuộc tính lớp này:
delimiter -- Đây là chuỗi ký tự mô tả phần giữ chỗ giới thiệu dấu phân cách. Giá trị mặc định là
$. Lưu ý rằng not này phải là một biểu thức chính quy, vì quá trình triển khai sẽ gọire.escape()trên chuỗi này nếu cần. Lưu ý thêm rằng bạn không thể thay đổi dấu phân cách sau khi tạo lớp (tức là một dấu phân cách khác phải được đặt trong không gian tên lớp của lớp con).idpattern -- Đây là biểu thức chính quy mô tả mẫu dành cho phần giữ chỗ không có dấu ngoặc nhọn. Giá trị mặc định là biểu thức chính quy
(?a:[_a-z][_a-z0-9]*). Nếu điều này được đưa ra và braceidpattern làNonethì mẫu này cũng sẽ áp dụng cho các phần giữ chỗ được chuẩn bị sẵn.Ghi chú
Vì flags mặc định là
re.IGNORECASEnên mẫu[a-z]có thể khớp với một số ký tự không phải ASCII. Đó là lý do tại sao chúng tôi sử dụng cờacục bộ ở đây.Thay đổi trong phiên bản 3.7: braceidpattern có thể được sử dụng để xác định các mẫu riêng biệt được sử dụng bên trong và bên ngoài niềng răng.
braceidpattern -- Điều này giống như idpattern nhưng mô tả mẫu dành cho các phần giữ chỗ có giằng. Mặc định là
None, có nghĩa là quay trở lại idpattern (tức là sử dụng cùng một mẫu cho cả dấu ngoặc nhọn bên trong và bên ngoài). Nếu được cung cấp, điều này cho phép bạn xác định các mẫu khác nhau cho phần giữ chỗ có giằng và không có giằng.Added in version 3.7.
flags -- Cờ biểu thức chính quy sẽ được áp dụng khi biên dịch biểu thức chính quy được sử dụng để nhận dạng các thay thế. Giá trị mặc định là
re.IGNORECASE. Lưu ý rằngre.VERBOSEsẽ luôn được thêm vào các cờ, vì vậy các idpatterntùy chỉnh phải tuân theo các quy ước dành cho các biểu thức chính quy dài dòng.Added in version 3.2.
Ngoài ra, bạn có thể cung cấp toàn bộ mẫu biểu thức chính quy bằng cách ghi đè thuộc tính lớp pattern. Nếu bạn thực hiện việc này, giá trị phải là một đối tượng biểu thức chính quy có bốn nhóm thu thập được đặt tên. Các nhóm chụp tương ứng với các quy tắc được đưa ra ở trên, cùng với quy tắc giữ chỗ không hợp lệ:
escaped -- Nhóm này khớp với chuỗi thoát, ví dụ:
$$, theo mẫu mặc định.named -- Nhóm này khớp với tên giữ chỗ không có dấu ngoặc nhọn; nó không được bao gồm dấu phân cách trong nhóm chụp.
braced -- Nhóm này khớp với tên giữ chỗ kèm theo dấu ngoặc nhọn; nó không được bao gồm dấu phân cách hoặc dấu ngoặc nhọn trong nhóm bắt giữ.
invalid -- Nhóm này khớp với bất kỳ mẫu dấu phân cách nào khác (thường là một dấu phân cách duy nhất) và nó sẽ xuất hiện cuối cùng trong biểu thức chính quy.
Các phương thức trên lớp này sẽ tăng ValueError nếu mẫu khớp với mẫu mà không khớp với một trong các nhóm được đặt tên này.
Chức năng trợ giúp¶
- string.capwords(s, sep=None)¶
Chia đối số thành các từ bằng cách sử dụng
str.split(), viết hoa từng từ bằng cách sử dụngstr.capitalize()và nối các từ viết hoa bằng cách sử dụngstr.join(). Nếu đối số thứ hai tùy chọn sep không có hoặcNone, các dòng ký tự khoảng trắng sẽ được thay thế bằng một khoảng trắng duy nhất và khoảng trắng ở đầu và cuối sẽ bị xóa, nếu không thì sep được sử dụng để phân tách và nối các từ.