string
--- 常見(jiàn)的字符串操作?
源代碼: Lib/string.py
字符串常量?
此模塊中定義的常量為:
- string.ascii_letters?
下文所述
ascii_lowercase
和ascii_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
,punctuation
和whitespace
的總和。
- 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_spec 和 conversion 的值將為
None
。
- get_field(field_name, args, kwargs)?
給定 field_name 作為
parse()
(見(jiàn)上文) 的返回值,將其轉換為要格式化的對象。 返回一個(gè)元組 (obj, used_key)。 默認版本接受在 PEP 3101 所定義形式的字符串,例如 "0[name]" 或 "label.title"。 args 和 kwargs 與傳給vformat()
的一樣。 返回值 used_key 與get_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ā)
IndexError
或KeyError
。
- check_unused_args(used_args, args, kwargs)?
在必要時(shí)實(shí)現對未使用參數進(jìn)行檢測。 此函數的參數是是格式字符串中實(shí)際引用的所有參數鍵的集合(整數表示位置參數,字符串表示名稱(chēng)參數),以及被傳給 vformat 的 args 和 kwargs 的引用。 未使用參數的集合可以根據這些形參計算出來(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)數。
float
和 Decimal
值的可用表示類(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
,-0
和nan
,無(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í)給出 mapping 和 kwds 并且存在重復時(shí),則以 kwds 中的占位符為優(yōu)先。
- safe_substitute(mapping={}, /, **kwds)?
類(lèi)似于
substitute()
,不同之處是如果有占位符未在 mapping 和 kwds 中找到,不是引發(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 raiseValueError
.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]*)
。 如果給出了此屬性并且 braceidpattern 為None
則此模式也將作用于帶花括號的占位符。備注
由于默認的 flags 為
re.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)拆分和拼接單詞。