string --- 常見(jiàn)的字符串操作?

源代碼: Lib/string.py


字符串常量?

此模塊中定義的常量為:

string.ascii_letters?

下文所述 ascii_lowercaseascii_uppercase 常量的拼連。 該值不依賴(lài)于語(yǔ)言區(qū)域。

string.ascii_lowercase?

小寫(xiě)字母 'abcdefghijklmnopqrstuvwxyz'。 該值不依賴(lài)于語(yǔ)言區(qū)域,不會(huì)發(fā)生改變。

string.ascii_uppercase?

大寫(xiě)字母 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'。 該值不依賴(lài)于語(yǔ)言區(qū)域,不會(huì)發(fā)生改變。

string.digits?

字符串 '0123456789'。

string.hexdigits?

字符串 '0123456789abcdefABCDEF'。

string.octdigits?

字符串 '01234567'。

string.punctuation?

由在 C 區(qū)域設(shè)置中被視為標(biāo)點(diǎn)符號(hào)的 ASCII 字符所組成的字符串: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~.

string.printable?

由被視為可打印符號(hào)的 ASCII 字符組成的字符串。 這是 digits, ascii_letters, punctuationwhitespace 的總和。

string.whitespace?

由被視為空白符號(hào)的 ASCII 字符組成的字符串。 其中包括空格、制表、換行、回車(chē)、進(jìn)紙和縱向制表符。

自定義字符串格式化?

內(nèi)置的字符串類(lèi)提供了通過(guò)使用 PEP 3101 所描述的 format() 方法進(jìn)行復(fù)雜變量替換和值格式化的能力。 string 模塊中的 Formatter 類(lèi)允許你使用與內(nèi)置 format() 方法相同的實(shí)現(xiàn)來(lái)創(chuàng)建并定制你自己的字符串格式化行為。

class string.Formatter?

Formatter 類(lèi)包含下列公有方法:

format(format_string, /, *args, **kwargs)?

首要的 API 方法。 它接受一個(gè)格式字符串和任意一組位置和關(guān)鍵字參數(shù)。 它只是一個(gè)調(diào)用 vformat() 的包裝器。

在 3.7 版更改: 格式字符串參數(shù)現(xiàn)在是 僅限位置參數(shù)

vformat(format_string, args, kwargs)?

此函數(shù)執(zhí)行實(shí)際的格式化操作。 它被公開(kāi)為一個(gè)單獨(dú)的函數(shù),用于需要傳入一個(gè)預(yù)定義字母作為參數(shù),而不是使用 *args**kwargs 語(yǔ)法將字典解包為多個(gè)單獨(dú)參數(shù)并重打包的情況。 vformat() 完成將格式字符串分解為字符數(shù)據(jù)和替換字段的工作。 它會(huì)調(diào)用下文所述的幾種不同方法。

此外,Formatter 還定義了一些旨在被子類(lèi)替換的方法:

parse(format_string)?

循環(huán)遍歷 format_string 并返回一個(gè)由可迭代對(duì)象組成的元組 (literal_text, field_name, format_spec, conversion)。 它會(huì)被 vformat() 用來(lái)將字符串分解為文本字面值或替換字段。

元組中的值在概念上表示一段字面文本加上一個(gè)替換字段。 如果沒(méi)有字面文本(如果連續(xù)出現(xiàn)兩個(gè)替換字段就會(huì)發(fā)生這種情況),則 literal_text 將是一個(gè)長(zhǎng)度為零的字符串。 如果沒(méi)有替換字段,則 field_name, format_specconversion 的值將為 None。

get_field(field_name, args, kwargs)?

給定 field_name 作為 parse() (見(jiàn)上文) 的返回值,將其轉(zhuǎn)換為要格式化的對(duì)象。 返回一個(gè)元組 (obj, used_key)。 默認(rèn)版本接受在 PEP 3101 所定義形式的字符串,例如 "0[name]" 或 "label.title"。 argskwargs 與傳給 vformat() 的一樣。 返回值 used_keyget_value()key 形參具有相同的含義。

get_value(key, args, kwargs)?

提取給定的字段值。 key 參數(shù)將為整數(shù)或字符串。 如果是整數(shù),它表示 args 中位置參數(shù)的索引;如果是字符串,它表示 kwargs 中的關(guān)鍵字參數(shù)名。

args 形參會(huì)被設(shè)為 vformat() 的位置參數(shù)列表,而 kwargs 形參會(huì)被設(shè)為由關(guān)鍵字參數(shù)組成的字典。

對(duì)于復(fù)合字段名稱(chēng),僅會(huì)為字段名稱(chēng)的第一個(gè)組件調(diào)用這些函數(shù);后續(xù)組件會(huì)通過(guò)普通屬性和索引操作來(lái)進(jìn)行處理。

因此舉例來(lái)說(shuō),字段表達(dá)式 '0.name' 將導(dǎo)致調(diào)用 get_value() 時(shí)附帶 key 參數(shù)值 0。 在 get_value() 通過(guò)調(diào)用內(nèi)置的 getattr() 函數(shù)返回后將會(huì)查找 name 屬性。

如果索引或關(guān)鍵字引用了一個(gè)不存在的項(xiàng),則將引發(fā) IndexErrorKeyError。

check_unused_args(used_args, args, kwargs)?

在必要時(shí)實(shí)現(xiàn)對(duì)未使用參數(shù)進(jìn)行檢測(cè)。 此函數(shù)的參數(shù)是是格式字符串中實(shí)際引用的所有參數(shù)鍵的集合(整數(shù)表示位置參數(shù),字符串表示名稱(chēng)參數(shù)),以及被傳給 vformat 的 argskwargs 的引用。 未使用參數(shù)的集合可以根據(jù)這些形參計(jì)算出來(lái)。 如果檢測(cè)失敗則 check_unused_args() 應(yīng)會(huì)引發(fā)一個(gè)異常。

format_field(value, format_spec)?

format_field() 會(huì)簡(jiǎn)單地調(diào)用內(nèi)置全局函數(shù) format()。 提供該方法是為了讓子類(lèi)能夠重載它。

convert_field(value, conversion)?

使用給定的轉(zhuǎn)換類(lèi)型(來(lái)自 parse() 方法所返回的元組)來(lái)轉(zhuǎn)換(由 get_field() 所返回的)值。 默認(rèn)版本支持 's' (str), 'r' (repr) 和 'a' (ascii) 等轉(zhuǎn)換類(lèi)型。

格式字符串語(yǔ)法?

str.format() 方法和 Formatter 類(lèi)共享相同的格式字符串語(yǔ)法(雖然對(duì)于 Formatter 來(lái)說(shuō),其子類(lèi)可以定義它們自己的格式字符串語(yǔ)法)。 具體語(yǔ)法與 格式化字符串字面值 相似,但較為簡(jiǎn)單一些,并且關(guān)鍵的一點(diǎn)是不支持任意表達(dá)式。

格式字符串包含有以花括號(hào) {} 括起來(lái)的“替換字段”。 不在花括號(hào)之內(nèi)的內(nèi)容被視為字面文本,會(huì)不加修改地復(fù)制到輸出中。 如果你需要在字面文本中包含花括號(hào)字符,可以通過(guò)重復(fù)來(lái)轉(zhuǎn)義: {{ and }}。

替換字段的語(yǔ)法如下:

replacement_field ::=  "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name        ::=  arg_name ("." attribute_name | "[" element_index "]")*
arg_name          ::=  [identifier | digit+]
attribute_name    ::=  identifier
element_index     ::=  digit+ | index_string
index_string      ::=  <any source character except "]"> +
conversion        ::=  "r" | "s" | "a"
format_spec       ::=  <described in the next section>

用不太正式的術(shù)語(yǔ)來(lái)描述,替換字段開(kāi)頭可以用一個(gè) field_name 指定要對(duì)值進(jìn)行格式化并取代替換字符被插入到輸出結(jié)果的對(duì)象。 field_name 之后有可選的 conversion 字段,它是一個(gè)感嘆號(hào) '!' 加一個(gè) format_spec,并以一個(gè)冒號(hào) ':' 打頭。 這些指明了替換值的非默認(rèn)格式。

另請(qǐng)參閱 格式規(guī)格迷你語(yǔ)言 一節(jié)。

field_name 本身以一個(gè)數(shù)字或關(guān)鍵字 arg_name 打頭。 如果為數(shù)字,則它指向一個(gè)位置參數(shù),而如果為關(guān)鍵字,則它指向一個(gè)命名關(guān)鍵字參數(shù)。 如果格式字符串中的數(shù)字 arg_names 為 0, 1, 2, ... 的序列,它們可以全部省略(而非部分省略),數(shù)字 0, 1, 2, ... 將會(huì)按順序自動(dòng)插入。 由于 arg_name 不使用引號(hào)分隔,因此無(wú)法在格式字符串中指定任意的字典鍵 (例如字符串 '10'':-]')。 arg_name 之后可以帶上任意數(shù)量的索引或?qū)傩员磉_(dá)式。 '.name' 形式的表達(dá)式會(huì)使用 getattr() 選擇命名屬性,而 '[index]' 形式的表達(dá)式會(huì)使用 __getitem__() 執(zhí)行索引查找。

在 3.1 版更改: 位置參數(shù)說(shuō)明符對(duì)于 str.format() 可以省略,因此 '{} {}'.format(a, b) 等價(jià)于 '{0} {1}'.format(a, b)。

在 3.4 版更改: 位置參數(shù)說(shuō)明符對(duì)于 Formatter 可以省略。

一些簡(jiǎn)單的格式字符串示例

"First, thou shalt count to {0}"  # References first positional argument
"Bring me a {}"                   # Implicitly references the first positional argument
"From {} to {}"                   # Same as "From {0} to {1}"
"My quest is {name}"              # References keyword argument 'name'
"Weight in tons {0.weight}"       # 'weight' attribute of first positional arg
"Units destroyed: {players[0]}"   # First element of keyword argument 'players'.

使用 conversion 字段在格式化之前進(jìn)行類(lèi)型強(qiáng)制轉(zhuǎn)換。 通常,格式化值的工作由值本身的 __format__() 方法來(lái)完成。 但是,在某些情況下最好強(qiáng)制將類(lèi)型格式化為一個(gè)字符串,覆蓋其本身的格式化定義。 通過(guò)在調(diào)用 __format__() 之前將值轉(zhuǎn)換為字符串,可以繞過(guò)正常的格式化邏輯。

目前支持的轉(zhuǎn)換旗標(biāo)有三種: '!s' 會(huì)對(duì)值調(diào)用 str()'!r' 調(diào)用 repr()'!a' 則調(diào)用 ascii()。

示例如下:

"Harold's a clever {0!s}"        # Calls str() on the argument first
"Bring out the holy {name!r}"    # Calls repr() on the argument first
"More {!a}"                      # Calls ascii() on the argument first

format_spec 字段包含值應(yīng)如何呈現(xiàn)的規(guī)格描述,例如字段寬度、對(duì)齊、填充、小數(shù)精度等細(xì)節(jié)信息。 每種值類(lèi)型可以定義自己的“格式化迷你語(yǔ)言”或?qū)?format_spec 的解讀方式。

大多數(shù)內(nèi)置類(lèi)型都支持同樣的格式化迷你語(yǔ)言,具體描述見(jiàn)下一節(jié)。

format_spec 字段還可以在其內(nèi)部包含嵌套的替換字段。 這些嵌套的替換字段可能包括字段名稱(chēng)、轉(zhuǎn)換旗標(biāo)和格式規(guī)格描述,但是不再允許更深層的嵌套。 format_spec 內(nèi)部的替換字段會(huì)在解讀 format_spec 字符串之前先被解讀。 這將允許動(dòng)態(tài)地指定特定值的格式。

請(qǐng)參閱 格式示例 一節(jié)查看相關(guān)示例。

格式規(guī)格迷你語(yǔ)言?

“格式規(guī)格”在格式字符串所包含的替換字段內(nèi)部使用,用于定義單個(gè)值應(yīng)如何呈現(xiàn) (參見(jiàn) 格式字符串語(yǔ)法格式字符串字面值)。 它們也可以被直接傳給內(nèi)置的 format() 函數(shù)。 每種可格式化的類(lèi)型都可以自行定義如何對(duì)格式規(guī)格進(jìn)行解讀。

大多數(shù)內(nèi)置類(lèi)型都為格式規(guī)格實(shí)現(xiàn)了下列選項(xiàng),不過(guò)某些格式化選項(xiàng)只被數(shù)值類(lèi)型所支持。

一般約定空的格式描述將產(chǎn)生與在值上調(diào)用 str() 相同的結(jié)果。 非空格式描述通常會(huì)修改此結(jié)果。

標(biāo)準(zhǔn)格式說(shuō)明符 的一般形式如下:

format_spec     ::=  [[fill]align][sign][z][#][0][width][grouping_option][.precision][type]
fill            ::=  <any character>
align           ::=  "<" | ">" | "=" | "^"
sign            ::=  "+" | "-" | " "
width           ::=  digit+
grouping_option ::=  "_" | ","
precision       ::=  digit+
type            ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

如果指定了一個(gè)有效的 align 值,則可以在該值前面加一個(gè) fill 字符,它可以為任意字符,如果省略則默認(rèn)為空格符。 在 格式化字符串字面值 或在使用 str.format() 方法時(shí)是無(wú)法使用花括號(hào)字面值 ("{" or "}") 作為 fill 字符的。 但是,通過(guò)嵌套替換字段插入花括號(hào)則是可以的。 這個(gè)限制不會(huì)影響 format() 函數(shù)。

各種對(duì)齊選項(xiàng)的含義如下:

選項(xiàng)

含意

'<'

強(qiáng)制字段在可用空間內(nèi)左對(duì)齊(這是大多數(shù)對(duì)象的默認(rèn)值)。

'>'

強(qiáng)制字段在可用空間內(nèi)右對(duì)齊(這是數(shù)字的默認(rèn)值)。

'='

強(qiáng)制在符號(hào)(如果有)之后數(shù)碼之前放置填充。 這被用于以 '+000000120' 形式打印字段。 這個(gè)對(duì)齊選項(xiàng)僅對(duì)數(shù)字類(lèi)型有效。 這是當(dāng) '0' 緊接在字段寬度之前時(shí)的默認(rèn)選項(xiàng)。

'^'

強(qiáng)制字段在可用空間內(nèi)居中。

請(qǐng)注意,除非定義了最小字段寬度,否則字段寬度將始終與填充它的數(shù)據(jù)大小相同,因此在這種情況下,對(duì)齊選項(xiàng)沒(méi)有意義。

sign 選項(xiàng)僅對(duì)數(shù)字類(lèi)型有效,可以是以下之一:

選項(xiàng)

含意

'+'

表示標(biāo)志應(yīng)該用于正數(shù)和負(fù)數(shù)。

'-'

表示標(biāo)志應(yīng)僅用于負(fù)數(shù)(這是默認(rèn)行為)。

space

表示應(yīng)在正數(shù)上使用前導(dǎo)空格,在負(fù)數(shù)上使用減號(hào)。

The 'z' option coerces negative zero floating-point values to positive zero after rounding to the format precision. This option is only valid for floating-point presentation types.

在 3.11 版更改: Added the 'z' option (see also PEP 682).

'#' 選項(xiàng)可讓“替代形式”被用于執(zhí)行轉(zhuǎn)換。 替代形式會(huì)針對(duì)不同的類(lèi)型分別定義。 此選項(xiàng)僅適用于整數(shù)、浮點(diǎn)數(shù)和復(fù)數(shù)類(lèi)型。 對(duì)于整數(shù)類(lèi)型,當(dāng)使用二進(jìn)制、八進(jìn)制或十六進(jìn)制輸出時(shí),此選項(xiàng)會(huì)為輸出值分別添加相應(yīng)的 '0b', '0o', '0x''0X' 前綴。 對(duì)于浮點(diǎn)數(shù)和復(fù)數(shù)類(lèi)型,替代形式會(huì)使得轉(zhuǎn)換結(jié)果總是包含小數(shù)點(diǎn)符號(hào),即使其不帶小數(shù)部分。 通常只有在帶有小數(shù)部分的情況下,此類(lèi)轉(zhuǎn)換的結(jié)果中才會(huì)出現(xiàn)小數(shù)點(diǎn)符號(hào)。 此外,對(duì)于 'g''G' 轉(zhuǎn)換,末尾的零不會(huì)從結(jié)果中被移除。

',' 選項(xiàng)表示使用逗號(hào)作為千位分隔符。 對(duì)于感應(yīng)區(qū)域設(shè)置的分隔符,請(qǐng)改用 'n' 整數(shù)表示類(lèi)型。

在 3.1 版更改: 添加了 ',' 選項(xiàng) (另請(qǐng)參閱 PEP 378)。

'_' 選項(xiàng)表示對(duì)浮點(diǎn)表示類(lèi)型和整數(shù)表示類(lèi)型 'd' 使用下劃線(xiàn)作為千位分隔符。 對(duì)于整數(shù)表示類(lèi)型 'b', 'o', 'x''X',將為每 4 個(gè)數(shù)位插入一個(gè)下劃線(xiàn)。 對(duì)于其他表示類(lèi)型指定此選項(xiàng)則將導(dǎo)致錯(cuò)誤。

在 3.6 版更改: 添加了 '_' 選項(xiàng) (另請(qǐng)參閱 PEP 515)。

width 是一個(gè)定義最小總字段寬度的十進(jìn)制整數(shù),包括任何前綴、分隔符和其他格式化字符。 如果未指定,則字段寬度將由內(nèi)容確定。

當(dāng)未顯式給出對(duì)齊方式時(shí),在 width 字段前加一個(gè)零 ('0') 字段將為數(shù)字類(lèi)型啟用感知正負(fù)號(hào)的零填充。 這相當(dāng)于設(shè)置 fill 字符為 '0'alignment 類(lèi)型為 '='

在 3.10 版更改: width 字段之前添加 '0' 不會(huì)再影響字符串的默認(rèn)對(duì)齊。

The precision is a decimal integer indicating how many digits should be displayed after the decimal point for presentation types 'f' and 'F', or before and after the decimal point for presentation types 'g' or 'G'. For string presentation types the field indicates the maximum field size - in other words, how many characters will be used from the field content. The precision is not allowed for integer presentation types.

最后,type 確定了數(shù)據(jù)應(yīng)如何呈現(xiàn)。

可用的字符串表示類(lèi)型是:

類(lèi)型

含意

's'

字符串格式。這是字符串的默認(rèn)類(lèi)型,可以省略。

None

's' 一樣。

可用的整數(shù)表示類(lèi)型是:

類(lèi)型

含意

'b'

二進(jìn)制格式。 輸出以 2 為基數(shù)的數(shù)字。

'c'

字符。在打印之前將整數(shù)轉(zhuǎn)換為相應(yīng)的unicode字符。

'd'

十進(jìn)制整數(shù)。 輸出以 10 為基數(shù)的數(shù)字。

'o'

八進(jìn)制格式。 輸出以 8 為基數(shù)的數(shù)字。

'x'

十六進(jìn)制格式。 輸出以 16 為基數(shù)的數(shù)字,使用小寫(xiě)字母表示 9 以上的數(shù)碼。

'X'

十六進(jìn)制格式。 輸出以 16 為基數(shù)的數(shù)字,使用大寫(xiě)字母表示 9 以上的數(shù)碼。 在指定 '#' 的情況下,前綴 '0x' 也將被轉(zhuǎn)為大寫(xiě)形式 '0X'。

'n'

數(shù)字。 這與 'd' 相似,不同之處在于它會(huì)使用當(dāng)前區(qū)域設(shè)置來(lái)插入適當(dāng)?shù)臄?shù)字分隔字符。

None

'd' 相同。

在上述的表示類(lèi)型之外,整數(shù)還可以通過(guò)下列的浮點(diǎn)表示類(lèi)型來(lái)格式化 (除了 'n'None)。 當(dāng)這樣做時(shí),會(huì)在格式化之前使用 float() 將整數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)。

floatDecimal 值的可用表示類(lèi)型有:

類(lèi)型

含意

'e'

科學(xué)計(jì)數(shù)法。 對(duì)于一個(gè)給定的精度 p,將數(shù)字格式化為以字母 'e' 分隔系數(shù)和指數(shù)的科學(xué)計(jì)數(shù)法形式。 系數(shù)在小數(shù)點(diǎn)之前有一位,之后有 p 位,總計(jì) p + 1 個(gè)有效數(shù)位。 如未指定精度,則會(huì)對(duì) float 采用小數(shù)點(diǎn)之后 6 位精度,而對(duì) Decimal 則顯示所有系數(shù)位。 如果小數(shù)點(diǎn)之后沒(méi)有數(shù)位,則小數(shù)點(diǎn)也會(huì)被略去,除非使用了 # 選項(xiàng)。

'E'

科學(xué)計(jì)數(shù)法。 與 'e' 相似,不同之處在于它使用大寫(xiě)字母 'E' 作為分隔字符。

'f'

定點(diǎn)表示法。 對(duì)于一個(gè)給定的精度 p,將數(shù)字格式化為在小數(shù)點(diǎn)之后恰好有 p 位的小數(shù)形式。 如未指定精度,則會(huì)對(duì) float 采用小數(shù)點(diǎn)之后 6 位精度,而對(duì) Decimal 則使用大到足夠顯示所有系數(shù)位的精度。 如果小數(shù)點(diǎn)之后沒(méi)有數(shù)位,則小數(shù)點(diǎn)也會(huì)被略去,除非使用了 # 選項(xiàng)。

'F'

定點(diǎn)表示。 與 'f' 相似,但會(huì)將 nan 轉(zhuǎn)為 NAN 并將 inf 轉(zhuǎn)為 INF。

'g'

常規(guī)格式。 對(duì)于給定精度 p >= 1,這會(huì)將數(shù)值舍入到 p 個(gè)有效數(shù)位,再將結(jié)果以定點(diǎn)表示法或科學(xué)計(jì)數(shù)法進(jìn)行格式化,具體取決于其值的大小。 精度 0 會(huì)被視為等價(jià)于精度 1

準(zhǔn)確的規(guī)則如下:假設(shè)使用表示類(lèi)型 'e' 和精度 p-1 進(jìn)行格式化的結(jié)果具有指數(shù)值 exp。 那么如果 m <= exp < p,其中 m 以 -4 表示浮點(diǎn)值而以 -6 表示 Decimal 值,該數(shù)字將使用類(lèi)型 'f' 和精度 p-1-exp 進(jìn)行格式化。 否則的話(huà),該數(shù)字將使用表示類(lèi)型 'e' 和精度 p-1 進(jìn)行格式化。 在兩種情況下,都會(huì)從有效數(shù)字中移除無(wú)意義的末尾零,如果小數(shù)點(diǎn)之后沒(méi)有余下數(shù)字則小數(shù)點(diǎn)也會(huì)被移除,除非使用了 '#' 選項(xiàng)。

如未指定精度,會(huì)對(duì) float 采用 6 個(gè)有效數(shù)位的精度。 對(duì)于 Decimal,結(jié)果的系數(shù)會(huì)沿用原值的系數(shù)數(shù)位;對(duì)于絕對(duì)值小于 1e-6 的值以及最小有效數(shù)位的位值大于 1 的數(shù)值將會(huì)使用科學(xué)計(jì)數(shù)法,在其他情況下則會(huì)使用定點(diǎn)表示法。

正負(fù)無(wú)窮,正負(fù)零和 nan 會(huì)分別被格式化為 inf, -inf, 0, -0nan,無(wú)論精度如何設(shè)定。

'G'

常規(guī)格式。 類(lèi)似于 'g',不同之處在于當(dāng)數(shù)值非常大時(shí)會(huì)切換為 'E'。 無(wú)窮與 NaN 也會(huì)表示為大寫(xiě)形式。

'n'

數(shù)字。 這與 'g' 相似,不同之處在于它會(huì)使用當(dāng)前區(qū)域設(shè)置來(lái)插入適當(dāng)?shù)臄?shù)字分隔字符。

'%'

百分比。 將數(shù)字乘以 100 并顯示為定點(diǎn) ('f') 格式,后面帶一個(gè)百分號(hào)。

None

對(duì)于 float 來(lái)說(shuō)這類(lèi)似于 'g',不同之處在于當(dāng)使用定點(diǎn)表示法時(shí),小數(shù)點(diǎn)之后將至少顯示一位。 所用的精度會(huì)大到足以精確表示給定的值。

對(duì)于 Decimal 來(lái)說(shuō)這相當(dāng)于 'g''G',具體取決于當(dāng)前 decimal 上下文的 context.capitals 值。

總體效果是將 str() 的輸出匹配為其他格式化因子所調(diào)整出的樣子。

格式示例?

本節(jié)包含 str.format() 語(yǔ)法的示例以及與舊式 % 格式化的比較。

該語(yǔ)法在大多數(shù)情況下與舊式的 % 格式化類(lèi)似,只是增加了 {}: 來(lái)取代 %。 例如,,'%03.2f' 可以被改寫(xiě)為 '{:03.2f}'。

新的格式語(yǔ)法還支持新增的不同選項(xiàng),將在以下示例中說(shuō)明。

按位置訪(fǎng)問(wèn)參數(shù):

>>>
>>> '{0}, {1}, {2}'.format('a', 'b', 'c')
'a, b, c'
>>> '{}, {}, {}'.format('a', 'b', 'c')  # 3.1+ only
'a, b, c'
>>> '{2}, {1}, {0}'.format('a', 'b', 'c')
'c, b, a'
>>> '{2}, {1}, {0}'.format(*'abc')      # unpacking argument sequence
'c, b, a'
>>> '{0}{1}{0}'.format('abra', 'cad')   # arguments' indices can be repeated
'abracadabra'

按名稱(chēng)訪(fǎng)問(wèn)參數(shù):

>>>
>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')
'Coordinates: 37.24N, -115.81W'
>>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'}
>>> 'Coordinates: {latitude}, {longitude}'.format(**coord)
'Coordinates: 37.24N, -115.81W'

訪(fǎng)問(wèn)參數(shù)的屬性:

>>>
>>> c = 3-5j
>>> ('The complex number {0} is formed from the real part {0.real} '
...  'and the imaginary part {0.imag}.').format(c)
'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.'
>>> class Point:
...     def __init__(self, x, y):
...         self.x, self.y = x, y
...     def __str__(self):
...         return 'Point({self.x}, {self.y})'.format(self=self)
...
>>> str(Point(4, 2))
'Point(4, 2)'

訪(fǎng)問(wèn)參數(shù)的項(xiàng):

>>>
>>> coord = (3, 5)
>>> 'X: {0[0]};  Y: {0[1]}'.format(coord)
'X: 3;  Y: 5'

替代 %s%r:

>>>
>>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')
"repr() shows quotes: 'test1'; str() doesn't: test2"

對(duì)齊文本以及指定寬度:

>>>
>>> '{:<30}'.format('left aligned')
'left aligned                  '
>>> '{:>30}'.format('right aligned')
'                 right aligned'
>>> '{:^30}'.format('centered')
'           centered           '
>>> '{:*^30}'.format('centered')  # use '*' as a fill char
'***********centered***********'

替代 %+f, %-f% f 以及指定正負(fù)號(hào):

>>>
>>> '{:+f}; {:+f}'.format(3.14, -3.14)  # show it always
'+3.140000; -3.140000'
>>> '{: f}; {: f}'.format(3.14, -3.14)  # show a space for positive numbers
' 3.140000; -3.140000'
>>> '{:-f}; {:-f}'.format(3.14, -3.14)  # show only the minus -- same as '{:f}; {:f}'
'3.140000; -3.140000'

替代 %x%o 以及轉(zhuǎn)換基于不同進(jìn)位制的值:

>>>
>>> # format also supports binary numbers
>>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)
'int: 42;  hex: 2a;  oct: 52;  bin: 101010'
>>> # with 0x, 0o, or 0b as prefix:
>>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)
'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'

使用逗號(hào)作為千位分隔符:

>>>
>>> '{:,}'.format(1234567890)
'1,234,567,890'

表示為百分?jǐn)?shù):

>>>
>>> points = 19
>>> total = 22
>>> 'Correct answers: {:.2%}'.format(points/total)
'Correct answers: 86.36%'

使用特定類(lèi)型的專(zhuān)屬格式化:

>>>
>>> import datetime
>>> d = datetime.datetime(2010, 7, 4, 12, 15, 58)
>>> '{:%Y-%m-%d %H:%M:%S}'.format(d)
'2010-07-04 12:15:58'

嵌套參數(shù)以及更復(fù)雜的示例:

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

模板字符串?

模板字符串提供了由 PEP 292 所描述的更簡(jiǎn)便的字符串替換方式。 模板字符串的一個(gè)主要用例是文本國(guó)際化 (i18n),因?yàn)樵诖藞?chǎng)景下,更簡(jiǎn)單的語(yǔ)法和功能使得文本翻譯過(guò)程比使用 Python 的其他內(nèi)置字符串格式化工具更為方便。 作為基于模板字符串構(gòu)建以實(shí)現(xiàn) i18n 的庫(kù)的一個(gè)示例,請(qǐng)參看 flufl.i18n 包。

模板字符串支持基于 $ 的替換,使用以下規(guī)則:

  • $$ 為轉(zhuǎn)義符號(hào);它會(huì)被替換為單個(gè)的 $。

  • $identifier 為替換占位符,它會(huì)匹配一個(gè)名為 "identifier" 的映射鍵。 在默認(rèn)情況下,"identifier" 限制為任意 ASCII 字母數(shù)字(包括下劃線(xiàn))組成的字符串,不區(qū)分大小寫(xiě),以下劃線(xiàn)或 ASCII 字母開(kāi)頭。 在 $ 字符之后的第一個(gè)非標(biāo)識(shí)符字符將表明占位符的終結(jié)。

  • ${identifier} 等價(jià)于 $identifier。 當(dāng)占位符之后緊跟著有效的但又不是占位符一部分的標(biāo)識(shí)符字符時(shí)需要使用,例如 "${noun}ification"。

在字符串的其他位置出現(xiàn) $ 將導(dǎo)致引發(fā) ValueError。

string 模塊提供了實(shí)現(xiàn)這些規(guī)則的 Template 類(lèi)。 Template 有下列方法:

class string.Template(template)?

該構(gòu)造器接受一個(gè)參數(shù)作為模板字符串。

substitute(mapping={}, /, **kwds)?

執(zhí)行模板替換,返回一個(gè)新字符串。 mapping 為任意字典類(lèi)對(duì)象,其中的鍵將匹配模板中的占位符。 或者你也可以提供一組關(guān)鍵字參數(shù),其中的關(guān)鍵字即對(duì)應(yīng)占位符。 當(dāng)同時(shí)給出 mappingkwds 并且存在重復(fù)時(shí),則以 kwds 中的占位符為優(yōu)先。

safe_substitute(mapping={}, /, **kwds)?

類(lèi)似于 substitute(),不同之處是如果有占位符未在 mappingkwds 中找到,不是引發(fā) KeyError 異常,而是將原始占位符不加修改地顯示在結(jié)果字符串中。 另一個(gè)與 substitute() 的差異是任何在其他情況下出現(xiàn)的 $ 將簡(jiǎn)單地返回 $ 而不是引發(fā) ValueError

此方法被認(rèn)為“安全”,因?yàn)殡m然仍有可能發(fā)生其他異常,但它總是嘗試返回可用的字符串而不是引發(fā)一個(gè)異常。 從另一方面來(lái)說(shuō),safe_substitute() 也可能根本算不上安全,因?yàn)樗鼘㈧o默地忽略錯(cuò)誤格式的模板,例如包含多余的分隔符、不成對(duì)的花括號(hào)或不是合法 Python 標(biāo)識(shí)符的占位符等等。

is_valid()?

Returns false if the template has invalid placeholders that will cause substitute() to raise ValueError.

3.11 新版功能.

get_identifiers()?

Returns a list of the valid identifiers in the template, in the order they first appear, ignoring any invalid identifiers.

3.11 新版功能.

Template 的實(shí)例還提供一個(gè)公有數(shù)據(jù)屬性:

template?

這是作為構(gòu)造器的 template 參數(shù)被傳入的對(duì)象。 一般來(lái)說(shuō),你不應(yīng)該修改它,但并不強(qiáng)制要求只讀訪(fǎng)問(wèn)。

以下是一個(gè)如何使用模版的示例:

>>>
>>> from string import Template
>>> s = Template('$who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes kung pao'
>>> d = dict(who='tim')
>>> Template('Give $who $100').substitute(d)
Traceback (most recent call last):
...
ValueError: Invalid placeholder in string: line 1, col 11
>>> Template('$who likes $what').substitute(d)
Traceback (most recent call last):
...
KeyError: 'what'
>>> Template('$who likes $what').safe_substitute(d)
'tim likes $what'

進(jìn)階用法:你可以派生 Template 的子類(lèi)來(lái)自定義占位符語(yǔ)法、分隔符,或用于解析模板字符串的整個(gè)正則表達(dá)式。 為此目的,你可以重載這些類(lèi)屬性:

  • delimiter -- 這是用來(lái)表示占位符的起始的分隔符的字符串字面值。 默認(rèn)值為 $。 請(qǐng)注意此參數(shù) 不能 為正則表達(dá)式,因?yàn)槠鋵?shí)現(xiàn)將在必要時(shí)對(duì)此字符串調(diào)用 re.escape()。 還要注意你不能在創(chuàng)建類(lèi)之后改變此分隔符(例如在子類(lèi)的類(lèi)命名空間中必須設(shè)置不同的分隔符)。

  • idpattern -- 這是用來(lái)描述不帶花括號(hào)的占位符的模式的正則表達(dá)式。 默認(rèn)值為正則表達(dá)式 (?a:[_a-z][_a-z0-9]*)。 如果給出了此屬性并且 braceidpatternNone 則此模式也將作用于帶花括號(hào)的占位符。

    備注

    由于默認(rèn)的 flagsre.IGNORECASE,模式 [a-z] 可以匹配某些非 ASCII 字符。 因此我們?cè)谶@里使用了局部旗標(biāo) a

    在 3.7 版更改: braceidpattern 可被用來(lái)定義對(duì)花括號(hào)內(nèi)部和外部進(jìn)行區(qū)分的模式。

  • braceidpattern -- 此屬性類(lèi)似于 idpattern 但是用來(lái)描述帶花括號(hào)的占位符的模式。 默認(rèn)值 None 意味著回退到 idpattern (即在花括號(hào)內(nèi)部和外部使用相同的模式)。 如果給出此屬性,這將允許你為帶花括號(hào)和不帶花括號(hào)的占位符定義不同的模式。

    3.7 新版功能.

  • flags -- 將在編譯用于識(shí)別替換內(nèi)容的正則表達(dá)式被應(yīng)用的正則表達(dá)式旗標(biāo)。 默認(rèn)值為 re.IGNORECASE。 請(qǐng)注意 re.VERBOSE 總是會(huì)被加為旗標(biāo),因此自定義的 idpattern 必須遵循詳細(xì)正則表達(dá)式的約定。

    3.2 新版功能.

作為另一種選項(xiàng),你可以通過(guò)重載類(lèi)屬性 pattern 來(lái)提供整個(gè)正則表達(dá)式模式。 如果你這樣做,該值必須為一個(gè)具有四個(gè)命名捕獲組的正則表達(dá)式對(duì)象。 這些捕獲組對(duì)應(yīng)于上面已經(jīng)給出的規(guī)則,以及無(wú)效占位符的規(guī)則:

  • escaped -- 這個(gè)組匹配轉(zhuǎn)義序列,在默認(rèn)模式中即 $$。

  • named -- 這個(gè)組匹配不帶花括號(hào)的占位符名稱(chēng);它不應(yīng)當(dāng)包含捕獲組中的分隔符。

  • braced -- 這個(gè)組匹配帶有花括號(hào)的占位符名稱(chēng);它不應(yīng)當(dāng)包含捕獲組中的分隔符或者花括號(hào)。

  • invalid -- 這個(gè)組匹配任何其他分隔符模式(通常為單個(gè)分隔符),并且它應(yīng)當(dāng)出現(xiàn)在正則表達(dá)式的末尾。

The methods on this class will raise ValueError if the pattern matches the template without one of these named groups matching.

輔助函數(shù)?

string.capwords(s, sep=None)?

使用 str.split() 將參數(shù)拆分為單詞,使用 str.capitalize() 將單詞轉(zhuǎn)為大寫(xiě)形式,使用 str.join() 將大寫(xiě)的單詞進(jìn)行拼接。 如果可選的第二個(gè)參數(shù) sep 被省略或?yàn)?None,則連續(xù)的空白字符會(huì)被替換為單個(gè)空格符并且開(kāi)頭和末尾的空白字符會(huì)被移除,否則 sep 會(huì)被用來(lái)拆分和拼接單詞。