string --- 常見的字符串操作?
源代碼: Lib/string.py
字符串常量?
此模塊中定義的常量為:
-
string.ascii_letters? 下文所述
ascii_lowercase和ascii_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ū)域中被視為標點符號的 ASCII 字符組成的字符串。
-
string.printable? 由被視為可打印符號的 ASCII 字符組成的字符串。 這是
digits,ascii_letters,punctuation和whitespace的總和。
-
string.whitespace? 由被視為空白符號的 ASCII 字符組成的字符串。 其中包括空格、制表、換行、回車、進紙和縱向制表符。
自定義字符串格式化?
內(nèi)置的字符串類提供了通過使用 PEP 3101 所描述的 format() 方法進行復雜變量替換和值格式化的能力。 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ù),用于需要傳入一個預定義字母作為參數(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_spec 和 conversion 的值將為
None。
-
get_field(field_name, args, kwargs)? 給定 field_name 作為
parse()(見上文) 的返回值,將其轉(zhuǎn)換為要格式化的對象。 返回一個元組 (obj, used_key)。 默認版本接受在 PEP 3101 所定義形式的字符串,例如 "0[name]" 或 "label.title"。 args 和 kwargs 與傳給vformat()的一樣。 返回值 used_key 與get_value()的 key 形參具有相同的含義。
-
get_value(key, args, kwargs)? 提取給定的字段值。 key 參數(shù)將為整數(shù)或字符串。 如果是整數(shù),它表示 args 中位置參數(shù)的索引;如果是字符串,它表示 kwargs 中的關(guān)鍵字參數(shù)名。
args 形參會被設為
vformat()的位置參數(shù)列表,而 kwargs 形參會被設為由關(guān)鍵字參數(shù)組成的字典。對于復合字段名稱,僅會為字段名稱的第一個組件調(diào)用這些函數(shù);后續(xù)組件會通過普通屬性和索引操作來進行處理。
因此舉例來說,字段表達式 '0.name' 將導致調(diào)用
get_value()時附帶 key 參數(shù)值 0。 在get_value()通過調(diào)用內(nèi)置的getattr()函數(shù)返回后將會查找name屬性。如果索引或關(guān)鍵字引用了一個不存在的項,則將引發(fā)
IndexError或KeyError。
-
check_unused_args(used_args, args, kwargs)? 在必要時實現(xiàn)對未使用參數(shù)進行檢測。 此函數(shù)的參數(shù)是是格式字符串中實際引用的所有參數(shù)鍵的集合(整數(shù)表示位置參數(shù),字符串表示名稱參數(shù)),以及被傳給 vformat 的 args 和 kwargs 的引用。 未使用參數(shù)的集合可以根據(jù)這些形參計算出來。 如果檢測失敗則
check_unused_args()應會引發(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()所返回的)值。 默認版本支持 's' (str), 'r' (repr) 和 'a' (ascii) 等轉(zhuǎn)換類型。
-
格式字符串語法?
str.format() 方法和 Formatter 類共享相同的格式字符串語法(雖然對于 Formatter 來說,其子類可以定義它們自己的格式字符串語法)。 具體語法與 格式化字符串字面值 相似,但也存在區(qū)別。
格式字符串包含有以花括號 {} 括起來的“替換字段”。 不在花括號之內(nèi)的內(nèi)容被視為字面文本,會不加修改地復制到輸出中。 如果你需要在字面文本中包含花括號字符,可以通過重復來轉(zhuǎn)義: {{ and }}。
替換字段的語法如下:
replacement_field ::= "{" [field_name] ["!"conversion] [":"format_spec] "}" field_name ::= arg_name ("."attribute_name| "["element_index"]")* arg_name ::= [identifier|digit+] attribute_name ::=identifierelement_index ::=digit+ |index_stringindex_string ::= <any source character except "]"> + conversion ::= "r" | "s" | "a" format_spec ::= <described in the next section>
用不太正式的術(shù)語來描述,替換字段開頭可以用一個 field_name 指定要對值進行格式化并取代替換字符被插入到輸出結(jié)果的對象。 field_name 之后有可選的 conversion 字段,它是一個感嘆號 '!' 加一個 format_spec,并以一個冒號 ':' 打頭。 這些指明了替換值的非默認格式。
另請參閱 格式規(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ū)傩员磉_式。 '.name' 形式的表達式會使用 getattr() 選擇命名屬性,而 '[index]' 形式的表達式會使用 __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 字段在格式化之前進行類型強制轉(zhuǎn)換。 通常,格式化值的工作由值本身的 __format__() 方法來完成。 但是,在某些情況下最好強制將類型格式化為一個字符串,覆蓋其本身的格式化定義。 通過在調(diào)用 __format__() 之前將值轉(zhuǎn)換為字符串,可以繞過正常的格式化邏輯。
目前支持的轉(zhuǎn)換旗標有三種: '!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 字段包含值應如何呈現(xiàn)的規(guī)格描述,例如字段寬度、對齊、填充、小數(shù)精度等細節(jié)信息。 每種值類型可以定義自己的“格式化迷你語言”或?qū)?format_spec 的解讀方式。
大多數(shù)內(nèi)置類型都支持同樣的格式化迷你語言,具體描述見下一節(jié)。
format_spec 字段還可以在其內(nèi)部包含嵌套的替換字段。 這些嵌套的替換字段可能包括字段名稱、轉(zhuǎn)換旗標和格式規(guī)格描述,但是不再允許更深層的嵌套。 format_spec 內(nèi)部的替換字段會在解讀 format_spec 字符串之前先被解讀。 這將允許動態(tài)地指定特定值的格式。
請參閱 格式示例 一節(jié)查看相關(guān)示例。
格式規(guī)格迷你語言?
“格式規(guī)格”在格式字符串所包含的替換字段內(nèi)部使用,用于定義單個值應如何呈現(xiàn) (參見 格式字符串語法 和 格式化字符串字面值)。 它們也可以被直接傳給內(nèi)置的 format() 函數(shù)。 每種可格式化的類型都可以自行定義如何對格式規(guī)格進行解讀。
大多數(shù)內(nèi)置類型都為格式規(guī)格實現(xiàn)了下列選項,不過某些格式化選項只被數(shù)值類型所支持。
一般約定空的格式描述將產(chǎn)生與在值上調(diào)用 str() 相同的結(jié)果。 非空格式描述通常會修改此結(jié)果。
標準格式說明符 的一般形式如下:
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" | "%"
如果指定了一個有效的 align 值,則可以在該值前面加一個 fill 字符,它可以為任意字符,如果省略則默認為空格符。 在 格式化字符串字面值 或在使用 str.format() 方法時是無法使用花括號字面值 ("{" or "}") 作為 fill 字符的。 但是,通過嵌套替換字段插入花括號則是可以的。 這個限制不會影響 format() 函數(shù)。
各種對齊選項的含義如下:
選項
含義
'<'強制字段在可用空間內(nèi)左對齊(這是大多數(shù)對象的默認值)。
'>'強制字段在可用空間內(nèi)右對齊(這是數(shù)字的默認值)。
'='強制將填充放置在符號(如果有)之后但在數(shù)字之前。這用于以“+000000120”形式打印字段。此對齊選項僅對數(shù)字類型有效。當'0'緊接在字段寬度之前時,它成為默認值。
'^'強制字段在可用空間內(nèi)居中。
請注意,除非定義了最小字段寬度,否則字段寬度將始終與填充它的數(shù)據(jù)大小相同,因此在這種情況下,對齊選項沒有意義。
sign 選項僅對數(shù)字類型有效,可以是以下之一:
選項
含義
'+'表示標志應該用于正數(shù)和負數(shù)。
'-'表示標志應僅用于負數(shù)(這是默認行為)。
space
表示應在正數(shù)上使用前導空格,在負數(shù)上使用減號。
'#' 選項可以讓“替代形式”被用于轉(zhuǎn)換。 替代形式可針對不同類型分別定義。 此選項僅對整數(shù)、浮點、復數(shù)和 Decimal 類型有效。 對于整數(shù)類型,當使用二進制、八進制或十六進制輸出時,此選項會為輸出值添加相應的 '0b', '0o' 或 '0x' 前綴。 對于浮點數(shù)、復數(shù)和 Decimal 類型,替代形式會使得轉(zhuǎn)換結(jié)果總是包含小數(shù)點符號,即使其不帶小數(shù)。 通常只有在帶有小數(shù)的情況下,此類轉(zhuǎn)換的結(jié)果中才會出現(xiàn)小數(shù)點符號。 此外,對于 'g' 和 'G' 轉(zhuǎn)換,末尾的零不會從結(jié)果中被移除。
',' 選項表示使用逗號作為千位分隔符。 對于感應區(qū)域設置的分隔符,請改用 'n' 整數(shù)表示類型。
在 3.1 版更改: 添加了 ',' 選項 (另請參閱 PEP 378)。
'_' 選項表示對浮點表示類型和整數(shù)表示類型 'd' 使用下劃線作為千位分隔符。 對于整數(shù)表示類型 'b', 'o', 'x' 和 'X',將為每 4 個數(shù)位插入一個下劃線。 對于其他表示類型指定此選項則將導致錯誤。
在 3.6 版更改: 添加了 '_' 選項 (另請參閱 PEP 515)。
width 是一個定義最小總字段寬度的十進制整數(shù),包括任何前綴、分隔符和其他格式化字符。 如果未指定,則字段寬度將由內(nèi)容確定。
當未顯式給出對齊方式時,在 width 字段前加一個零 ('0') 字段將為數(shù)字類型啟用感知正負號的零填充。 這相當于設置 fill 字符為 '0' 且 alignment 類型為 '='。
precision 是一個十進制數(shù)字,表示對于以 'f' and 'F' 格式化的浮點數(shù)值要在小數(shù)點后顯示多少個數(shù)位,或者對于以 'g' 或 'G' 格式化的浮點數(shù)值要在小數(shù)點前后共顯示多少個數(shù)位。 對于非數(shù)字類型,該字段表示最大字段大小 —— 換句話說就是要使用多少個來自字段內(nèi)容的字符。 對于整數(shù)值則不允許使用 precision。
最后,type 確定了數(shù)據(jù)應如何呈現(xiàn)。
可用的字符串表示類型是:
類型
含義
's'字符串格式。這是字符串的默認類型,可以省略。
None
和
's'一樣。
可用的整數(shù)表示類型是:
類型
含義
'b'二進制格式。 輸出以 2 為基數(shù)的數(shù)字。
'c'字符。在打印之前將整數(shù)轉(zhuǎn)換為相應的unicode字符。
'd'十進制整數(shù)。 輸出以 10 為基數(shù)的數(shù)字。
'o'八進制格式。 輸出以 8 為基數(shù)的數(shù)字。
'x'十六進制格式。 輸出以 16 為基數(shù)的數(shù)字,使用小寫字母表示 9 以上的數(shù)碼。
'X'十六進制格式。 輸出以 16 為基數(shù)的數(shù)字,使用大寫字母表示 9 以上的數(shù)碼。
'n'數(shù)字。 這與
'd'相似,不同之處在于它會使用當前區(qū)域設置來插入適當?shù)臄?shù)字分隔字符。None
和
'd'相同。
在上述的表示類型之外,整數(shù)還可以通過下列的浮點表示類型來格式化 (除了 'n' 和 None)。 當這樣做時,會在格式化之前使用 float() 將整數(shù)轉(zhuǎn)換為浮點數(shù)。
浮點數(shù)和小數(shù)值可用的表示類型有:
類型
含義
'e'指數(shù)表示。 以使用字母 'e' 來標示指數(shù)的科學計數(shù)法打印數(shù)字。 默認的精度為
6。
'E'指數(shù)表示。 與
'e'相似,不同之處在于它使用大寫字母 'E' 作為分隔字符。
'f'定點表示。 將數(shù)字顯示為一個定點數(shù)。 默認的精確度為
6。
'F'定點表示。 與
'f'相似,但會將nan轉(zhuǎn)為NAN并將inf轉(zhuǎn)為INF。
'g'常規(guī)格式。 對于給定的精度
p >= 1,這會將數(shù)值舍入到p位有效數(shù)字,再將結(jié)果以定點格式或科學計數(shù)法進行格式化,具體取決于其值的大小。準確的規(guī)則如下:假設使用表示類型
'e'和精度p-1進行格式化的結(jié)果具有指數(shù)值exp。 則如果-4 <= exp < p,該數(shù)字將使用表示類型'f'和精度p-1-exp進行格式化。 否則的話,該數(shù)字將使用表示類型'e'和精度p-1進行格式化。 在兩種情況下,都會從有效數(shù)字中移除無意義的末尾零,并且如果小數(shù)點之后沒有數(shù)字則小數(shù)點也會被移除,除非使用了'#'選項。正負無窮,正負零和 nan 會分別被格式化為
inf,-inf,0,-0和nan,無論精度如何設定。精度
0會被視為等同于精度1。 默認精度為6。
'G'常規(guī)格式。 類似于
'g',不同之處在于當數(shù)值非常大時會切換為'E'。 無窮與 NaN 也會表示為大寫形式。
'n'數(shù)字。 這與
'g'相似,不同之處在于它會使用當前區(qū)域設置來插入適當?shù)臄?shù)字分隔字符。
'%'百分比。 將數(shù)字乘以 100 并顯示為定點 (
'f') 格式,后面帶一個百分號。None
類似于
'g',不同之處在于當使用定點表示法時,小數(shù)點后將至少顯示一位。 默認精度與表示給定值所需的精度一樣。 整體效果為與其他格式修飾符所調(diào)整的str()輸出保持一致。
格式示例?
本節(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}'.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)換基于不同進位制的值:
>>> # 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'
表示為百分數(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ù)以及更復雜的示例:
>>> 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"的映射鍵。 在默認情況下,"identifier"限制為任意 ASCII 字母數(shù)字(包括下劃線)組成的字符串,不區(qū)分大小寫,以下劃線或 ASCII 字母開頭。 在$字符之后的第一個非標識符字符將表明占位符的終結(jié)。${identifier}等價于$identifier。 當占位符之后緊跟著有效的但又不是占位符一部分的標識符字符時需要使用,例如"${noun}ification"。
在字符串的其他位置出現(xiàn) $ 將導致引發(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)鍵字即對應占位符。 當同時給出 mapping 和 kwds 并且存在重復時,則以 kwds 中的占位符為優(yōu)先。
-
safe_substitute(mapping, **kwds)? 類似于
substitute(),不同之處是如果有占位符未在 mapping 和 kwds 中找到,不是引發(fā)KeyError異常,而是將原始占位符不加修改地顯示在結(jié)果字符串中。 另一個與substitute()的差異是任何在其他情況下出現(xiàn)的$將簡單地返回$而不是引發(fā)ValueError。此方法被認為“安全”,因為雖然仍有可能發(fā)生其他異常,但它總是嘗試返回可用的字符串而不是引發(fā)一個異常。 從另一方面來說,
safe_substitute()也可能根本算不上安全,因為它將靜默地忽略錯誤格式的模板,例如包含多余的分隔符、不成對的花括號或不是合法 Python 標識符的占位符等等。
Template的實例還提供一個公有數(shù)據(jù)屬性:-
template? 這是作為構(gòu)造器的 template 參數(shù)被傳入的對象。 一般來說,你不應該修改它,但并不強制要求只讀訪問。
-
以下是一個如何使用模版的示例:
>>> 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'
進階用法:你可以派生 Template 的子類來自定義占位符語法、分隔符,或用于解析模板字符串的整個正則表達式。 為此目的,你可以重載這些類屬性:
delimiter -- 這是用來表示占位符的起始的分隔符的字符串字面值。 默認值為
$。 請注意此參數(shù) 不能 為正則表達式,因為其實現(xiàn)將在必要時對此字符串調(diào)用re.escape()。 還要注意你不能在創(chuàng)建類之后改變此分隔符(例如在子類的類命名空間中必須設置不同的分隔符)。idpattern -- 這是用來描述不帶花括號的占位符的模式的正則表達式。 默認值為正則表達式
(?a:[_a-z][_a-z0-9]*)。 如果給出了此屬性并且 braceidpattern 為None則此模式也將作用于帶花括號的占位符。注解
由于默認的 flags 為
re.IGNORECASE,模式[a-z]可以匹配某些非 ASCII 字符。 因此我們在這里使用了局部旗標a。在 3.7 版更改: braceidpattern 可被用來定義對花括號內(nèi)部和外部進行區(qū)分的模式。
braceidpattern -- 此屬性類似于 idpattern 但是用來描述帶花括號的占位符的模式。 默認值
None意味著回退到 idpattern (即在花括號內(nèi)部和外部使用相同的模式)。 如果給出此屬性,這將允許你為帶花括號和不帶花括號的占位符定義不同的模式。3.7 新版功能.
flags -- 將在編譯用于識別替換內(nèi)容的正則表達式被應用的正則表達式旗標。 默認值為
re.IGNORECASE。 請注意re.VERBOSE總是會被加為旗標,因此自定義的 idpattern 必須遵循詳細正則表達式的約定。3.2 新版功能.
作為另一種選項,你可以通過重載類屬性 pattern 來提供整個正則表達式模式。 如果你這樣做,該值必須為一個具有四個命名捕獲組的正則表達式對象。 這些捕獲組對應于上面已經(jīng)給出的規(guī)則,以及無效占位符的規(guī)則:
escaped -- 這個組匹配轉(zhuǎn)義序列,在默認模式中即
$$。named -- 這個組匹配不帶花括號的占位符名稱;它不應當包含捕獲組中的分隔符。
braced -- 這個組匹配帶有花括號的占位符名稱;它不應當包含捕獲組中的分隔符或者花括號。
invalid -- 這個組匹配任何其他分隔符模式(通常為單個分隔符),并且它應當出現(xiàn)在正則表達式的末尾。
輔助函數(shù)?
-
string.capwords(s, sep=None)? 使用
str.split()將參數(shù)拆分為單詞,使用str.capitalize()將單詞轉(zhuǎn)為大寫形式,使用str.join()將大寫的單詞進行拼接。 如果可選的第二個參數(shù) sep 被省略或為None,則連續(xù)的空白字符會被替換為單個空格符并且開頭和末尾的空白字符會被移除,否則 sep 會被用來拆分和拼接單詞。
