string — 常用字串操作

原始碼: Lib/string.py


字串常量

此模組中定義的常量有:

string.ascii_letters

下面描述的 ascii_lowercaseascii_uppercase 常量的連線。此值不依賴於區域設定。

string.ascii_lowercase

小寫字母 'abcdefghijklmnopqrstuvwxyz'。此值不依賴於區域設定,並且不會更改。

string.ascii_uppercase

大寫字母 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'。此值不依賴於區域設定,並且不會更改。

string.digits

字串 '0123456789'

string.hexdigits

字串 '0123456789abcdefABCDEF'

string.octdigits

字串 '01234567'

string.punctuation

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

string.printable

被視為可列印的 ASCII 字元的字串。這是 digitsascii_letterspunctuationwhitespace 的組合。

string.whitespace

包含所有被視為空格的 ASCII 字元的字串。這包括字元空格、製表符、換行符、回車符、換頁符和垂直製表符。

自定義字串格式化

內建的字串類提供了透過 format() 方法(在PEP 3101中描述)執行復雜變數替換和值格式化的能力。Formatter 類位於 string 模組中,允許您使用與內建 format() 方法相同的實現來建立和自定義自己的字串格式化行為。

class string.Formatter

Formatter 類具有以下公共方法

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

主要 API 方法。它接受一個格式字串和一組任意的位置和關鍵字引數。它只是一個呼叫 vformat() 的包裝器。

在 3.7 版本中更改: 格式字串引數現在是 僅限位置

vformat(format_string, args, kwargs)

此函式執行實際的格式化工作。它被公開為一個單獨的函式,用於您想要傳入預定義的引數字典的情況,而不是使用 *args**kwargs 語法解包和重新打包字典作為單獨的引數。vformat() 執行將格式字串分解為字元資料和替換欄位的工作。它呼叫下面描述的各種方法。

此外,Formatter 定義了許多旨在由子類替換的方法

parse(format_string)

迴圈遍歷 format_string 並返回一個元組 (literal_text, field_name, format_spec, conversion) 的可迭代物件。這被 vformat() 用來將字串分解為文字文字或替換欄位。

元組中的值在概念上表示一段文字文字,後跟一個替換欄位。如果沒有任何文字文字(如果兩個替換欄位連續出現,則會發生這種情況),則 literal_text 將是一個零長度的字串。如果沒有替換欄位,則 field_nameformat_specconversion 的值將為 None

get_field(field_name, args, kwargs)

給定由 parse() 返回的 field_name(見上文),將其轉換為要格式化的物件。返回一個元組 (obj, used_key)。預設版本採用 PEP 3101 中定義的格式的字串,例如 “0[name]” 或 “label.title”。argskwargs 與傳遞給 vformat() 的相同。返回值 used_key 的含義與 get_value()key 引數的含義相同。

get_value(key, args, kwargs)

檢索給定的欄位值。key 引數可以是整數或字串。如果它是整數,則表示 args 中位置引數的索引;如果它是字串,則表示 kwargs 中的命名引數。

args 引數設定為 vformat() 的位置引數列表,而 kwargs 引數設定為關鍵字引數字典。

對於複合字段名稱,這些函式僅對欄位名稱的第一個元件呼叫;後續元件透過正常的屬性和索引操作進行處理。

例如,欄位表示式 ‘0.name’ 將導致使用 key 引數為 0 呼叫 get_value()。在 get_value() 返回後,將透過呼叫內建的 getattr() 函式來查詢 name 屬性。

如果索引或關鍵字引用了不存在的專案,則應引發 IndexErrorKeyError

check_unused_args(used_args, args, kwargs)

如果需要,實現對未使用引數的檢查。此函式的引數是在格式字串中實際引用的所有引數鍵的集合(位置引數的整數和命名引數的字串),以及傳遞給 vformat 的 argskwargs 的引用。可以從這些引數計算未使用的引數集。如果檢查失敗,則假定 check_unused_args() 會引發異常。

format_field(value, format_spec)

format_field() 只是簡單地呼叫全域性 format() 內建函式。提供此方法是為了讓子類可以重寫它。

convert_field(value, conversion)

根據轉換型別(如 parse() 方法返回的元組中)轉換值(由 get_field() 返回)。預設版本理解 ‘s’ (str), ‘r’ (repr) 和 ‘a’ (ascii) 轉換型別。

格式字串語法

str.format() 方法和 Formatter 類對於格式字串使用相同的語法(儘管在 Formatter 的情況下,子類可以定義自己的格式字串語法)。此語法與 格式化字串字面值 的語法相關,但它不如後者複雜,尤其是不支援任意表達式。

格式字串包含用花括號 {} 包圍的“替換欄位”。任何不包含在花括號中的內容都被視為文字,這些文字將保持不變地複製到輸出中。如果您需要在文字中包含花括號字元,可以透過雙倍的方式進行轉義:{{}}

替換欄位的語法如下

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       ::=  format-spec:format_spec

用不太正式的術語來說,替換欄位可以以 field_name 開始,它指定要格式化並插入到輸出中而不是替換欄位的物件的值。field_name 後面可以選擇性地跟隨一個 conversion 欄位,該欄位前面有一個感嘆號 '!',以及一個 format_spec,該欄位前面有一個冒號 ':'。這些指定替換值的非預設格式。

另請參閱 格式規範迷你語言 部分。

field_name 本身以 arg_name 開頭,它可以是數字或關鍵字。如果它是數字,則表示位置引數,如果它是關鍵字,則表示命名關鍵字引數。如果對字串呼叫 str.isdecimal() 返回 true,則將 arg_name 視為數字。如果格式字串中的數字 arg_name 按順序為 0、1、2、…,則可以全部省略(不只是部分),並且數字 0、1、2、… 將按該順序自動插入。因為 arg_name 沒有用引號分隔,所以不可能在格式字串中指定任意字典鍵(例如,字串 '10'':-]')。arg_name 後面可以跟任意數量的索引或屬性表示式。形式為 '.name' 的表示式使用 getattr() 選擇命名屬性,而形式為 '[index]' 的表示式使用 __getitem__() 執行索引查詢。

在 3.1 版本中更改: 對於 str.format(),可以省略位置引數說明符,因此 '{} {}'.format(a, b) 等效於 '{0} {1}'.format(a, b)

在 3.4 版本中更改: 對於 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 欄位會在格式化之前導致型別強制轉換。通常,格式化值的任務由值本身的 __format__() 方法完成。但是,在某些情況下,需要強制將型別格式化為字串,從而覆蓋其自身的格式化定義。透過在呼叫 __format__() 之前將值轉換為字串,可以繞過正常的格式化邏輯。

目前支援三個轉換標誌:'!s',它在值上呼叫 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 欄位包含如何呈現值的規範,包括欄位寬度、對齊方式、填充、十進位制精度等等詳細資訊。每種值型別都可以定義其自己的“格式化迷你語言”或對 format_spec 的解釋。

大多數內建型別都支援通用的格式化迷你語言,這將在下一節中進行描述。

format_spec 欄位還可以包含其中巢狀的替換欄位。這些巢狀的替換欄位可以包含欄位名稱、轉換標誌和格式規範,但不允許更深的巢狀。在解釋 format_spec 字串之前,將替換 format_spec 中的替換欄位。這允許動態指定值的格式。

有關示例,請參見 格式示例 部分。

格式規範迷你語言

“格式規範”用於格式字串中包含的替換欄位內,以定義如何呈現各個值(請參閱格式字串語法f-字串)。 它們也可以直接傳遞給內建的 format() 函式。每個可格式化的型別都可以定義如何解釋格式規範。

大多數內建型別都實現了以下格式規範的選項,但某些格式選項僅受數字型別支援。

通常的約定是,空的格式規範產生的結果與呼叫值的 str() 相同。非空的格式規範通常會修改結果。

標準格式說明符的一般形式為

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 字元,該字元可以是任意字元,如果省略則預設為空格。在 格式化字串字面值中或使用 str.format() 方法時,不能使用字面大括號(“{”或“}”)作為 fill 字元。 但是,可以使用巢狀的替換欄位插入大括號。此限制不影響 format() 函式。

各種對齊選項的含義如下

選項

含義

'<'

強制欄位在可用空間內左對齊(這是大多數物件的預設設定)。

'>'

強制欄位在可用空間內右對齊(這是數字的預設設定)。

'='

強制填充放置在符號(如果有)之後,但在數字之前。這用於以“+000000120”的形式列印欄位。此對齊選項僅對數字型別有效,不包括 complex。當 ‘0’ 緊跟在欄位寬度之前時,它將成為數字的預設設定。

'^'

強制欄位在可用空間內居中。

請注意,除非定義了最小欄位寬度,否則欄位寬度將始終與填充它的資料大小相同,因此對齊選項在這種情況下沒有意義。

sign 選項僅對數字型別有效,並且可以是以下之一

選項

含義

'+'

表示正數和負數都應使用符號。

'-'

表示僅對負數使用符號(這是預設行為)。

空格

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

'z' 選項在舍入到格式精度後,將負零浮點值強制轉換為正零。此選項僅對浮點表示型別有效。

在 3.11 版本中更改:添加了 'z' 選項(另請參閱 PEP 682)。

'#' 選項導致將“備用形式”用於轉換。備用形式對於不同型別的定義不同。此選項僅對整數、浮點數和複數型別有效。對於整數,當使用二進位制、八進位制或十六進位制輸出時,此選項會將相應的字首 '0b''0o''0x''0X' 新增到輸出值。對於浮點數和複數,備用形式會導致轉換結果始終包含小數點字元,即使其後沒有數字也是如此。通常,小數點字元僅在數字之後才出現在這些轉換的結果中。此外,對於 'g''G' 轉換,不會從結果中刪除尾隨零。

',' 選項表示對浮點表示型別和整數表示型別 'd' 使用逗號作為千位分隔符。對於其他表示型別,此選項是一個錯誤。對於感知區域設定的分隔符,請改用 'n' 整數表示型別。

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

'_' 選項表示對浮點表示型別和整數表示型別 'd' 使用下劃線作為千位分隔符。對於整數表示型別 'b''o''x''X',每 4 位數字將插入下劃線。對於其他表示型別,指定此選項是錯誤的。

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

width 是一個十進位制整數,定義最小總欄位寬度,包括任何字首、分隔符和其他格式化字元。如果未指定,則欄位寬度將由內容確定。

當沒有給出顯式對齊時,在 width 欄位前面加上零 ('0') 字元可以為數字型別啟用感知符號的零填充,不包括 complex。這等效於 fill 字元為 '0'alignment 型別為 '='

在 3.10 版本中更改:width 欄位前面加上 '0' 不再影響字串的預設對齊方式。

precision 是一個十進位制整數,指示對於表示型別 'f''F',小數點後應顯示多少位數字,或者對於表示型別 'g''G',小數點前和後應顯示多少位數字。對於字串表示型別,該欄位指示最大欄位大小 - 換句話說,將使用欄位內容中的多少個字元。整數表示型別不允許使用 precision

最後,type 確定應如何呈現資料。

可用的字串表示型別是

型別

含義

's'

字串格式。這是字串的預設型別,可以省略。

's' 相同。

可用的整數表示型別是

型別

含義

'b'

二進位制格式。以 2 為底輸出數字。

'c'

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

'd'

十進位制整數。以 10 為底輸出數字。

'o'

八進位制格式。以 8 為底輸出數字。

'x'

十六進位制格式。以 16 為底輸出數字,對於 9 以上的數字使用小寫字母。

'X'

十六進位制格式。以 16 為底輸出數字,對於 9 以上的數字使用大寫字母。如果指定了 '#',則字首 '0x' 也將大寫為 '0X'

'n'

數字。這與 'd' 相同,只不過它使用當前的區域設定來插入適當的數字分隔符。

'd' 相同。

除了上述表示型別之外,還可以使用下面列出的浮點表示型別格式化整數('n'None 除外)。這樣做時,在格式化之前,會使用 float() 將整數轉換為浮點數。

可用於 floatDecimal 值的表示型別是

型別

含義

'e'

科學計數法。對於給定的精度 p,以科學計數法格式化數字,字母 ‘e’ 將係數與指數分隔開。係數在小數點之前有一位數字,在小數點之後有 p 位數字,總共 p + 1 位有效數字。如果未給定精度,則 float 將使用小數點後 6 位數字的精度,並顯示 Decimal 的所有係數數字。如果 p=0,則省略小數點,除非使用 # 選項。

'E'

科學計數法。與 'e' 相同,只不過它使用大寫字母 ‘E’ 作為分隔符。

'f'

定點表示法。對於給定的精度 p,將數字格式化為小數點後精確到 p 位的十進位制數。如果沒有給出精度,對於 float,小數點後使用 6 位精度,對於 Decimal,使用足夠大的精度來顯示所有係數位。如果 p=0,則省略小數點,除非使用了 # 選項。

'F'

定點表示法。與 'f' 相同,但將 nan 轉換為 NAN,將 inf 轉換為 INF

'g'

通用格式。對於給定的精度 p >= 1,將數字四捨五入到 p 位有效數字,然後根據其大小,以定點格式或科學計數法格式化結果。精度 0 被視為與精度 1 等效。

精確規則如下:假設使用表示型別 'e' 和精度 p-1 格式化的結果的指數為 exp。那麼,如果 m <= exp < p,其中 m 對於浮點數是 -4,對於 Decimals 是 -6,則數字以表示型別 'f' 和精度 p-1-exp 格式化。否則,數字以表示型別 'e' 和精度 p-1 格式化。在這兩種情況下,都會從有效數中刪除不重要的尾隨零,如果小數點後沒有剩餘數字,也會刪除小數點,除非使用了 '#' 選項。

如果沒有給出精度,對於 float,使用 6 位有效數字的精度。對於 Decimal,結果的係數由該值的係數位形成;對於絕對值小於 1e-6 的值以及最小有效位的值大於 1 的值,使用科學計數法,否則使用定點表示法。

正無窮大和負無窮大、正零和負零以及 nan 分別格式化為 inf-inf0-0nan,無論精度如何。

'G'

通用格式。與 'g' 相同,但如果數字太大,則切換到 'E'。無窮大和 NaN 的表示形式也使用大寫。

'n'

數字。這與 'g' 相同,只是它使用當前的區域設定來插入適當的數字分隔符。

'%'

百分比。將數字乘以 100 並以固定 ('f') 格式顯示,後跟一個百分號。

對於 float,這類似於 'g' 型別,只是當使用定點表示法格式化結果時,它始終至少包含小數點後一位數字,並且當 exp >= p - 1 時切換到科學計數法。當未指定精度時,後者將盡可能大,以便忠實地表示給定值。

對於 Decimal,這與 'g''G' 相同,具體取決於當前十進位制上下文的 context.capitals 值。

總體效果是匹配 str() 的輸出,並由其他格式修飾符修改。

結果應正確四捨五入到小數點後給定精度 p 位。對於 float,舍入模式與 round() 內建函式的舍入模式匹配。對於 Decimal,將使用當前 context 的舍入模式。

對於 complex,可用的表示型別與 float 的表示型別相同(不允許使用 '%')。複數的實部和虛部都根據指定的表示型別格式化為浮點數。它們由虛部的強制符號分隔,後者以 j 字尾結尾。如果缺少表示型別,則結果將匹配 str() 的輸出(具有非零實部的複數也用括號括起來),可能會被其他格式修飾符修改。

格式示例

本節包含 str.format() 語法的示例,並與舊的 %-格式化進行比較。

在大多數情況下,該語法類似於舊的 %-格式化,並添加了 {},並且使用 : 代替 %。例如,'%03.2f' 可以轉換為 '{:03.2f}'

新的格式語法還支援新的和不同的選項,如下面的示例所示。

按位置訪問引數

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

按名稱訪問引數

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

訪問引數的屬性

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

訪問引數的項

>>> 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 並將值轉換為不同的進位制

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

使用特定於型別的格式

>>> 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 中所述。模板字串的主要用例是國際化 (i18n),因為在這種情況下,與 Python 中其他內建的字串格式化工具相比,更簡單的語法和功能使其更容易翻譯。有關基於模板字串構建的 i18n 庫的示例,請參閱 flufl.i18n 包。

模板字串支援基於 $ 的替換,使用以下規則

  • $$ 是轉義符;它被替換為單個 $

  • $identifier 命名與 "identifier" 的對映鍵匹配的替換佔位符。預設情況下,"identifier" 僅限於任何以不區分大小寫的 ASCII 字母數字字串(包括下劃線)開頭,且以下劃線或 ASCII 字母開頭的字串。$ 字元之後的第一個非識別符號字元將終止此佔位符規範。

  • ${identifier} 等效於 $identifier。當有效的識別符號字元跟在佔位符之後但不是佔位符的一部分時,例如 "${noun}ification",則需要使用此形式。

字串中任何其他出現的 $ 都會導致引發 ValueError

string 模組提供了一個 Template 類來實現這些規則。Template 的方法如下:

class string.Template(template)

建構函式接受一個引數,即模板字串。

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

執行模板替換,返回一個新的字串。mapping 是任何具有與模板中佔位符匹配的鍵的類字典物件。或者,您可以提供關鍵字引數,其中關鍵字是佔位符。當同時給出 mappingkwds 並且存在重複項時,kwds 中的佔位符優先。

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

substitute() 類似,但如果 mappingkwds 中缺少佔位符,則不會引發 KeyError 異常,而是在結果字串中原樣顯示原始佔位符。另外,與 substitute() 不同,任何其他出現的 $ 將只返回 $,而不會引發 ValueError

儘管可能仍然會發生其他異常,但此方法被稱為“安全”,因為它始終嘗試返回一個可用的字串,而不是引發異常。在另一種意義上,safe_substitute() 可能並非安全,因為它會靜默忽略包含懸空分隔符、不匹配的大括號或不是有效 Python 識別符號的佔位符的格式錯誤的模板。

is_valid()

如果模板具有會導致 substitute() 引發 ValueError 的無效佔位符,則返回 false。

3.11 版本新增。

get_identifiers()

返回模板中有效識別符號的列表,按照它們第一次出現的順序排列,忽略任何無效識別符號。

3.11 版本新增。

Template 例項還提供一個公共資料屬性

template

這是傳遞給建構函式的 template 引數的物件。通常,您不應該更改它,但不會強制執行只讀訪問。

以下是如何使用 Template 的示例

>>> 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 – 這是描述佔位符引入分隔符的字面字串。預設值為 $。請注意,這應該不是正則表示式,因為實現將根據需要在此字串上呼叫 re.escape()。另請注意,您不能在類建立後更改分隔符(即,必須在子類的類名稱空間中設定不同的分隔符)。

  • idpattern – 這是描述非大括號佔位符模式的正則表示式。預設值是正則表示式 (?a:[_a-z][_a-z0-9]*)。如果給出了此值,並且 braceidpatternNone,則此模式也將適用於大括號佔位符。

    注意

    由於預設 flagsre.IGNORECASE,因此模式 [a-z] 可以與某些非 ASCII 字元匹配。這就是為什麼我們在這裡使用本地 a 標誌的原因。

    在 3.7 版本中更改: braceidpattern 可用於定義大括號內外使用的單獨模式。

  • braceidpattern – 這類似於 idpattern,但描述了大括號佔位符的模式。預設為 None,這意味著回退到 idpattern(即,在大括號內外使用相同的模式)。如果給出,則允許您為大括號和非大括號佔位符定義不同的模式。

    3.7 版本新增。

  • flags – 這是編譯用於識別替換的正則表示式時將應用的正則表示式標誌。預設值為 re.IGNORECASE。請注意,re.VERBOSE 將始終新增到標誌中,因此自定義 idpattern 必須遵循詳細正則表示式的約定。

    3.2 版本新增。

或者,您可以透過覆蓋類屬性 pattern 來提供整個正則表示式模式。如果這樣做,該值必須是一個具有四個命名捕獲組的正則表示式物件。捕獲組對應於上面給出的規則,以及無效佔位符規則

  • escaped – 此組匹配轉義序列,例如預設模式中的 $$

  • named – 此組匹配非大括號佔位符名稱;它不應在捕獲組中包含分隔符。

  • braced – 此組匹配大括號括起來的佔位符名稱;它不應在捕獲組中包含分隔符或大括號。

  • invalid – 此組匹配任何其他分隔符模式(通常是單個分隔符),並且它應出現在正則表示式的末尾。

如果模式與模板匹配,但沒有這些命名組之一匹配,則此類上的方法將引發 ValueError

輔助函式

string.capwords(s, sep=None)

使用 str.split() 將引數拆分為單詞,使用 str.capitalize() 將每個單詞大寫,然後使用 str.join() 將大寫的單詞連線起來。如果可選的第二個引數 sep 不存在或為 None,則將執行的空白字元替換為單個空格,並刪除前導和尾隨空格;否則,使用 sep 來拆分和連線單詞。