string
— 常用字串操作¶
原始碼: Lib/string.py
字串常量¶
此模組中定義的常量有:
- string.ascii_letters¶
下面描述的
ascii_lowercase
和ascii_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 字元的字串。這是
digits
、ascii_letters
、punctuation
和whitespace
的組合。
- 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_name、format_spec 和 conversion 的值將為
None
。
- get_field(field_name, args, kwargs)¶
給定由
parse()
返回的 field_name(見上文),將其轉換為要格式化的物件。返回一個元組 (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 中的命名引數。
args 引數設定為
vformat()
的位置引數列表,而 kwargs 引數設定為關鍵字引數字典。對於複合字段名稱,這些函式僅對欄位名稱的第一個元件呼叫;後續元件透過正常的屬性和索引操作進行處理。
例如,欄位表示式 ‘0.name’ 將導致使用 key 引數為 0 呼叫
get_value()
。在get_value()
返回後,將透過呼叫內建的getattr()
函式來查詢name
屬性。如果索引或關鍵字引用了不存在的專案,則應引發
IndexError
或KeyError
。
- check_unused_args(used_args, args, kwargs)¶
如果需要,實現對未使用引數的檢查。此函式的引數是在格式字串中實際引用的所有引數鍵的集合(位置引數的整數和命名引數的字串),以及傳遞給 vformat 的 args 和 kwargs 的引用。可以從這些引數計算未使用的引數集。如果檢查失敗,則假定
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”的形式列印欄位。此對齊選項僅對數字型別有效,不包括 |
|
強制欄位在可用空間內居中。 |
請注意,除非定義了最小欄位寬度,否則欄位寬度將始終與填充它的資料大小相同,因此對齊選項在這種情況下沒有意義。
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()
將整數轉換為浮點數。
型別
含義
'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
、-inf
、0
、-0
和nan
,無論精度如何。
'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 是任何具有與模板中佔位符匹配的鍵的類字典物件。或者,您可以提供關鍵字引數,其中關鍵字是佔位符。當同時給出 mapping 和 kwds 並且存在重複項時,kwds 中的佔位符優先。
- safe_substitute(mapping={}, /, **kwds)¶
與
substitute()
類似,但如果 mapping 和 kwds 中缺少佔位符,則不會引發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]*)
。如果給出了此值,並且 braceidpattern 為None
,則此模式也將適用於大括號佔位符。注意
由於預設 flags 是
re.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 來拆分和連線單詞。