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

源代碼: Lib/string.py


字符串常量?

此模塊中定義的常量為:

string.ascii_letters?

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

string.ascii_lowercase?

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

string.ascii_uppercase?

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

string.digits?

字符串 '0123456789'。

string.hexdigits?

字符串 '0123456789abcdefABCDEF'。

string.octdigits?

字符串 '01234567'。

string.punctuation?

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

string.printable?

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

string.whitespace?

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

自定義字符串格式化?

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

class string.Formatter?

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

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

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

在 3.7 版更改: 格式字符串參數現在是 僅限位置參數。

vformat(format_string, args, kwargs)?

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

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

parse(format_string)?

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

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

get_field(field_name, args, kwargs)?

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

get_value(key, args, kwargs)?

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

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

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

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

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

check_unused_args(used_args, args, kwargs)?

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

format_field(value, format_spec)?

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

convert_field(value, conversion)?

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

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

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

格式字符串包含有以花括號 {} 括起來(lái)的“替換字段”。 不在花括號之內的內容被視為字面文本,會(huì )不加修改地復制到輸出中。 如果你需要在字面文本中包含花括號字符,可以通過(guò)重復來(lái)轉義: {{ 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 指定要對值進(jìn)行格式化并取代替換字符被插入到輸出結果的對象。 field_name 之后有可選的 conversion 字段,它是一個(gè)感嘆號 '!' 加一個(gè) format_spec,并以一個(gè)冒號 ':' 打頭。 這些指明了替換值的非默認格式。

另請參閱 格式規格迷你語(yǔ)言 一節。

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

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

在 3.4 版更改: 位置參數說(shuō)明符對于 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)型強制轉換。 通常,格式化值的工作由值本身的 __format__() 方法來(lái)完成。 但是,在某些情況下最好強制將類(lèi)型格式化為一個(gè)字符串,覆蓋其本身的格式化定義。 通過(guò)在調用 __format__() 之前將值轉換為字符串,可以繞過(guò)正常的格式化邏輯。

目前支持的轉換旗標有三種: '!s' 會(huì )對值調用 str(),'!r' 調用 repr()'!a' 則調用 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 字段包含值應如何呈現的規格描述,例如字段寬度、對齊、填充、小數精度等細節信息。 每種值類(lèi)型可以定義自己的“格式化迷你語(yǔ)言”或對 format_spec 的解讀方式。

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

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

請參閱 格式示例 一節查看相關(guān)示例。

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

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

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

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

標準格式說(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 字符,它可以為任意字符,如果省略則默認為空格符。 在 格式化字符串字面值 或在使用 str.format() 方法時(shí)是無(wú)法使用花括號字面值 ("{" or "}") 作為 fill 字符的。 但是,通過(guò)嵌套替換字段插入花括號則是可以的。 這個(gè)限制不會(huì )影響 format() 函數。

各種對齊選項的含義如下:

選項

含意

'<'

強制字段在可用空間內左對齊(這是大多數對象的默認值)。

'>'

強制字段在可用空間內右對齊(這是數字的默認值)。

'='

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

'^'

強制字段在可用空間內居中。

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

sign 選項僅對數字類(lèi)型有效,可以是以下之一:

選項

含意

'+'

表示標志應該用于正數和負數。

'-'

表示標志應僅用于負數(這是默認行為)。

space

表示應在正數上使用前導空格,在負數上使用減號。

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

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

',' 選項表示使用逗號作為千位分隔符。 對于感應區域設置的分隔符,請改用 'n' 整數表示類(lèi)型。

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

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

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

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

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

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

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 確定了數據應如何呈現。

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

類(lèi)型

含意

's'

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

None

's' 一樣。

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

類(lèi)型

含意

'b'

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

'c'

字符。在打印之前將整數轉換為相應的unicode字符。

'd'

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

'o'

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

'x'

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

'X'

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

'n'

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

None

'd' 相同。

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

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

類(lèi)型

含意

'e'

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

'E'

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

'f'

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

'F'

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

'g'

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

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

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

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

'G'

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

'n'

數字。 這與 'g' 相似,不同之處在于它會(huì )使用當前區域設置來(lái)插入適當的數字分隔字符。

'%'

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

None

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

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

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

格式示例?

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

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

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

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

>>>
>>> '{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)參數:

>>>
>>> '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)參數的屬性:

>>>
>>> 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)參數的項:

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

對齊文本以及指定寬度:

>>>
>>> '{:<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}; {:+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 以及轉換基于不同進(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'

使用逗號作為千位分隔符:

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

表示為百分數:

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

嵌套參數以及更復雜的示例:

>>>
>>> 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è)主要用例是文本國際化 (i18n),因為在此場(chǎng)景下,更簡(jiǎn)單的語(yǔ)法和功能使得文本翻譯過(guò)程比使用 Python 的其他內置字符串格式化工具更為方便。 作為基于模板字符串構建以實(shí)現 i18n 的庫的一個(gè)示例,請參看 flufl.i18n 包。

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

  • $$ 為轉義符號;它會(huì )被替換為單個(gè)的 $。

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

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

在字符串的其他位置出現 $ 將導致引發(fā) ValueError。

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

class string.Template(template)?

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

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

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

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

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

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

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è)公有數據屬性:

template?

這是作為構造器的 template 參數被傳入的對象。 一般來(lái)說(shuō),你不應該修改它,但并不強制要求只讀訪(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è)正則表達式。 為此目的,你可以重載這些類(lèi)屬性:

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

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

    備注

    由于默認的 flagsre.IGNORECASE,模式 [a-z] 可以匹配某些非 ASCII 字符。 因此我們在這里使用了局部旗標 a。

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

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

    3.7 新版功能.

  • flags -- 將在編譯用于識別替換內容的正則表達式被應用的正則表達式旗標。 默認值為 re.IGNORECASE。 請注意 re.VERBOSE 總是會(huì )被加為旗標,因此自定義的 idpattern 必須遵循詳細正則表達式的約定。

    3.2 新版功能.

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

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

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

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

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

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

輔助函數?

string.capwords(s, sep=None)?

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