string --- 常見的字符串操作?

源代碼: Lib/string.py


字符串常量?

此模塊中定義的常量為:

string.ascii_letters?

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

string.ascii_lowercase?

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

string.ascii_uppercase?

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

string.digits?

字符串 '0123456789'。

string.hexdigits?

字符串 '0123456789abcdefABCDEF'

string.octdigits?

字符串 '01234567'。

string.punctuation?

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

string.printable?

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

string.whitespace?

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

自定義字符串格式化?

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

class string.Formatter?

Formatter 類包含下列公有方法:

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

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

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

vformat(format_string, args, kwargs)?

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

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

parse(format_string)?

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

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

get_field(field_name, args, kwargs)?

給定 field_name 作為 parse() (見上文) 的返回值,將其轉(zhuǎn)換為要格式化的對象。 返回一個元組 (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 形參會被設(shè)為 vformat() 的位置參數(shù)列表,而 kwargs 形參會被設(shè)為由關(guān)鍵字參數(shù)組成的字典。

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

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

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

check_unused_args(used_args, args, kwargs)?

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

format_field(value, format_spec)?

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

convert_field(value, conversion)?

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

格式字符串語法?

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

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

替換字段的語法如下:

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ù)語來描述,替換字段開頭可以用一個 field_name 指定要對值進(jìn)行格式化并取代替換字符被插入到輸出結(jié)果的對象。 field_name 之后有可選的 conversion 字段,它是一個感嘆號 '!' 加一個 format_spec,并以一個冒號 ':' 打頭。 這些指明了替換值的非默認(rèn)格式。

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

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

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

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

一些簡單的格式字符串示例

"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__() 方法來完成。 但是,在某些情況下最好強(qiáng)制將類型格式化為一個字符串,覆蓋其本身的格式化定義。 通過在調(diào)用 __format__() 之前將值轉(zhuǎn)換為字符串,可以繞過正常的格式化邏輯。

目前支持的轉(zhuǎn)換旗標(biāo)有三種: '!s' 會對值調(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ī)格描述,例如字段寬度、對齊、填充、小數(shù)精度等細(xì)節(jié)信息。 每種值類型可以定義自己的“格式化迷你語言”或?qū)?format_spec 的解讀方式。

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

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

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

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

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

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

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

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

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

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

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

選項

含意

'<'

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

'>'

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

'='

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

'^'

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

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

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

選項

含意

'+'

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

'-'

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

space

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

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

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

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

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

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

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

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

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

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

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

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

類型

含意

'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ù)碼。 在指定 '#' 的情況下,前綴 '0x' 也將被轉(zhuǎn)為大寫形式 '0X'。

'n'

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

None

'd' 相同。

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

floatDecimal 值的可用表示類型有:

類型

含意

'e'

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

'E'

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

'f'

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

'F'

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

'g'

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

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

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

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

'G'

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

'n'

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

'%'

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

None

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

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

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

格式示例?

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

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

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

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

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

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

訪問參數(shù)的項:

>>>
>>> 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}; {:+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'

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

>>>
>>> '{:,}'.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 所描述的更簡便的字符串替換方式。 模板字符串的一個主要用例是文本國際化 (i18n),因為在此場景下,更簡單的語法和功能使得文本翻譯過程比使用 Python 的其他內(nèi)置字符串格式化工具更為方便。 作為基于模板字符串構(gòu)建以實現(xiàn) i18n 的庫的一個示例,請參看 flufl.i18n 包。

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

  • $$ 為轉(zhuǎn)義符號;它會被替換為單個的 $

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

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

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

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

class string.Template(template)?

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

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

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

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

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

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

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ù)據(jù)屬性:

template?

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

以下是一個如何使用模版的示例:

>>>
>>> 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 的子類來自定義占位符語法、分隔符,或用于解析模板字符串的整個正則表達(dá)式。 為此目的,你可以重載這些類屬性:

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

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

    備注

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

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

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

    3.7 新版功能.

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

    3.2 新版功能.

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

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

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

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

  • invalid -- 這個組匹配任何其他分隔符模式(通常為單個分隔符),并且它應(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)為大寫形式,使用 str.join() 將大寫的單詞進(jìn)行拼接。 如果可選的第二個參數(shù) sep 被省略或為 None,則連續(xù)的空白字符會被替換為單個空格符并且開頭和末尾的空白字符會被移除,否則 sep 會被用來拆分和拼接單詞。