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

源代碼: Lib/string.py


字符串常量?

此模塊中定義的常量為:

string.ascii_letters?

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

string.ascii_lowercase?

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

string.ascii_uppercase?

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

string.digits?

字符串 '0123456789'

string.hexdigits?

字符串 '0123456789abcdefABCDEF'

string.octdigits?

字符串 '01234567'

string.punctuation?

由在 C 語(yǔ)言區(qū)域中被視為標(biāo)點(diǎn)符號(hào)的 ASCII 字符組成的字符串。

string.printable?

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

string.whitespace?

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

自定義字符串格式化?

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

class string.Formatter?

Formatter 類包含下列公有方法:

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

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

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ù)合字段名稱,僅會(huì)為字段名稱的第一個(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ù),字符串表示名稱參數(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()。 提供該方法是為了讓子類能夠重載它。

convert_field(value, conversion)?

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

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

str.format() 方法和 Formatter 類共享相同的格式字符串語(yǔ)法(雖然對(duì)于 Formatter 來(lái)說(shuō),其子類可以定義它們自己的格式字符串語(yǔ)法)。 具體語(yǔ)法與 格式化字符串字面值 相似,但也存在區(qū)別。

格式字符串包含有以花括號(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)描述,替換字段開頭可以用一個(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)行類型強(qiáng)制轉(zhuǎn)換。 通常,格式化值的工作由值本身的 __format__() 方法來(lái)完成。 但是,在某些情況下最好強(qiáng)制將類型格式化為一個(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()

幾個(gè)例子:

"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é)信息。 每種值類型可以定義自己的“格式化迷你語(yǔ)言”或?qū)?format_spec 的解讀方式。

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

format_spec 字段還可以在其內(nèi)部包含嵌套的替換字段。 這些嵌套的替換字段可能包括字段名稱、轉(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ù)。 每種可格式化的類型都可以自行定義如何對(duì)格式規(guī)格進(jìn)行解讀。

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

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

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

format_spec     ::=  [[fill]align][sign][#][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”形式打印字段。此對(duì)齊選項(xiàng)僅對(duì)數(shù)字類型有效。當(dāng)'0'緊接在字段寬度之前時(shí),它成為默認(rèn)值。

'^'

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

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

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

選項(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)。

'#' 選項(xiàng)可以讓“替代形式”被用于轉(zhuǎn)換。 替代形式可針對(duì)不同類型分別定義。 此選項(xiàng)僅對(duì)整數(shù)、浮點(diǎn)、復(fù)數(shù)和 Decimal 類型有效。 對(duì)于整數(shù)類型,當(dāng)使用二進(jìn)制、八進(jìn)制或十六進(jìn)制輸出時(shí),此選項(xiàng)會(huì)為輸出值添加相應(yīng)的 '0b', '0o''0x' 前綴。 對(duì)于浮點(diǎn)數(shù)、復(fù)數(shù)和 Decimal 類型,替代形式會(huì)使得轉(zhuǎn)換結(jié)果總是包含小數(shù)點(diǎn)符號(hào),即使其不帶小數(shù)。 通常只有在帶有小數(shù)的情況下,此類轉(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ù)表示類型。

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

'_' 選項(xiàng)表示對(duì)浮點(diǎn)表示類型和整數(shù)表示類型 'd' 使用下劃線作為千位分隔符。 對(duì)于整數(shù)表示類型 'b', 'o', 'x''X',將為每 4 個(gè)數(shù)位插入一個(gè)下劃線。 對(duì)于其他表示類型指定此選項(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ù)字類型啟用感知正負(fù)號(hào)的零填充。 這相當(dāng)于設(shè)置 fill 字符為 '0'alignment 類型為 '='

precision 是一個(gè)十進(jìn)制數(shù)字,表示對(duì)于以 'f' and 'F' 格式化的浮點(diǎn)數(shù)值要在小數(shù)點(diǎn)后顯示多少個(gè)數(shù)位,或者對(duì)于以 'g''G' 格式化的浮點(diǎn)數(shù)值要在小數(shù)點(diǎn)前后共顯示多少個(gè)數(shù)位。 對(duì)于非數(shù)字類型,該字段表示最大字段大小 —— 換句話說(shuō)就是要使用多少個(gè)來(lái)自字段內(nèi)容的字符。 對(duì)于整數(shù)值則不允許使用 precision

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

可用的字符串表示類型是:

類型

含義

's'

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

None

's' 一樣。

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

類型

含義

'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ù)字,使用小寫字母表示 9 以上的數(shù)碼。

'X'

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

'n'

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

None

'd' 相同。

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

浮點(diǎn)數(shù)和小數(shù)值可用的表示類型有:

類型

含義

'e'

指數(shù)表示。 以使用字母 'e' 來(lái)標(biāo)示指數(shù)的科學(xué)計(jì)數(shù)法打印數(shù)字。 默認(rèn)的精度為 6

'E'

指數(shù)表示。 與 'e' 相似,不同之處在于它使用大寫字母 'E' 作為分隔字符。

'f'

定點(diǎn)表示。 將數(shù)字顯示為一個(gè)定點(diǎn)數(shù)。 默認(rèn)的精確度為 6

'F'

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

'g'

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

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

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

精度 0 會(huì)被視為等同于精度 1。 默認(rèn)精度為 6

'G'

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

'n'

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

'%'

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

None

類似于 'g',不同之處在于當(dāng)使用定點(diǎn)表示法時(shí),小數(shù)點(diǎn)后將至少顯示一位。 默認(rèn)精度與表示給定值所需的精度一樣。 整體效果為與其他格式修飾符所調(diào)整的 str() 輸出保持一致。

格式示例?

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

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

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

按位置訪問(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'

按名稱訪問(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'

訪問(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)'

訪問(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%'

使用特定類型的專屬格式化:

>>> 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ù)字(包括下劃線)組成的字符串,不區(qū)分大小寫,以下劃線或 ASCII 字母開頭。 在 $ 字符之后的第一個(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 類。 Template 有下列方法:

class string.Template(template)?

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

substitute(mapping, **kwds)?

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

safe_substitute(mapping, **kwds)?

類似于 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í)符的占位符等等。

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

template?

這是作為構(gòu)造器的 template 參數(shù)被傳入的對(duì)象。 一般來(lái)說(shuō),你不應(yīng)該修改它,但并不強(qiá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)自定義占位符語(yǔ)法、分隔符,或用于解析模板字符串的整個(gè)正則表達(dá)式。 為此目的,你可以重載這些類屬性:

  • delimiter -- 這是用來(lái)表示占位符的起始的分隔符的字符串字面值。 默認(rèn)值為 $。 請(qǐng)注意此參數(shù) 不能 為正則表達(dá)式,因?yàn)槠鋵?shí)現(xiàn)將在必要時(shí)對(duì)此字符串調(diào)用 re.escape()。 還要注意你不能在創(chuàng)建類之后改變此分隔符(例如在子類的類命名空間中必須設(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 -- 此屬性類似于 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ò)重載類屬性 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)的占位符名稱;它不應(yīng)當(dāng)包含捕獲組中的分隔符。

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

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

輔助函數(shù)?

string.capwords(s, sep=None)?

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