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

Python 認為是可列印的 ASCII 字元字串。這是 digitsascii_letterspunctuationwhitespace 的組合。

備註

根據設計,string.printable.isprintable() 返回 False。特別是,string.printable 在 POSIX 意義上是不可列印的(參見 LC_CTYPE)。

string.whitespace

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

自定義字串格式化

內建字串類透過 PEP 3101 中描述的 format() 方法,提供了複雜的變數替換和值格式化功能。string 模組中的 Formatter 類允許您使用與內建 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 的值將為 Nonefield_name 的值未修改,非編號位置欄位的自動編號由 vformat() 完成。

get_field(field_name, args, kwargs)

給定 field_name,將其轉換為要格式化的物件。parse() 返回的 field_name 的自動編號在呼叫此方法之前由 vformat() 完成。返回一個元組 (obj, used_key)。預設版本採用 PEP 3101 中定義的字串形式,例如“0[name]”或“label.title”。argskwargs 是作為引數傳遞給 vformat() 的。返回值 used_keyget_value()key 引數具有相同的含義。

get_value(key, args, kwargs)

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

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

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

因此,例如,欄位表示式“0.name”將導致 get_value() 被呼叫,其中 key 引數為 0。在 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 開頭,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-字串t-字串)。它們也可以直接傳遞給內建的 format() 函式。每個可格式化型別都可以定義格式規範的解釋方式。

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

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

標準格式指定符 的一般形式是

format_spec:             [options][width_and_precision][type]
options:                 [[fill]align][sign]["z"]["#"]["0"]
fill:                    <any character>
align:                   "<" | ">" | "=" | "^"
sign:                    "+" | "-" | " "
width_and_precision:     [width_with_grouping][precision_with_grouping]
width_with_grouping:     [width][grouping]
precision_with_grouping: "." [precision][grouping] | "." grouping
width:                   digit+
precision:               digit+
grouping:                "," | "_"
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' 轉換,結果中不會刪除末尾的零。

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

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

3.10 版本發生變化: width 欄位前加上 '0' 不再影響字串的預設對齊方式。

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

widthprecision 欄位後面的 grouping 選項分別指定了數字整數部分和小數部分的數字分組分隔符。它可以是以下之一

選項

含義

','

對於整數表示型別 'd' 和浮點表示型別(不包括 'n'),每 3 位插入一個逗號。對於其他表示型別,不支援此選項。

'_'

對於整數表示型別 'd' 和浮點表示型別(不包括 'n'),每 3 位插入一個下劃線。對於整數表示型別 'b''o''x''X',每 4 位插入一個下劃線。對於其他表示型別,不支援此選項。

對於區域設定感知分隔符,請改用 'n' 表示型別。

3.1 版本發生變化: 添加了 ',' 選項 (另請參見 PEP 378)。

3.6 版本發生變化: 添加了 '_' 選項 (另請參見 PEP 515)。

3.14 版本發生變化: 支援小數部分的 grouping 選項。

最後,type 決定了資料的呈現方式。

可用的字串表示型別為

型別

含義

's'

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

None

's' 相同。

可用的整數表示型別為

型別

含義

'b'

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

'c'

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

'd'

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

'o'

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

'x'

十六進位制格式。以 16 為基數輸出數字,使用小寫字母表示大於 9 的數字。

'X'

十六進位制格式。以 16 為基數輸出數字,使用大寫字母表示大於 9 的數字。如果指定了 '#',則字首 '0x' 也會轉換為大寫 '0X'

'n'

數字。這與 'd' 相同,不同之處在於它使用當前區域設定插入適當的數字分組分隔符。

None

'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') 格式顯示,後跟百分號。

None

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

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

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

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

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'
>>> '{:_}'.format(1234567890)
'1_234_567_890'
>>> '{:_b}'.format(1234567890)
'100_1001_1001_0110_0000_0010_1101_0010'
>>> '{:_x}'.format(1234567890)
'4996_02d2'
>>> '{:_}'.format(123456789.123456789)
'123_456_789.12345679'
>>> '{:.,}'.format(123456789.123456789)
'123456789.123,456,79'
>>> '{:,._}'.format(123456789.123456789)
'123,456,789.123_456_79'

表示百分比

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

模板字串($-字串)

備註

此處描述的功能是在 Python 2.4 中引入的;這是一種基於正則表示式的簡單模板方法。它早於 str.format()格式化字串字面值模板字串字面值

它與在 Python 3.14 中引入的模板字串字面值 (t-字串) 無關。這些字串字面值會評估為 string.templatelib.Template 物件,這些物件可以在 string.templatelib 模組中找到。

模板字串提供了 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 用於拆分和連線單詞。