摘要:由在語言區(qū)域中被視為標(biāo)點(diǎn)符號(hào)的字符組成的字符串。給定作為見上文的返回值,將其轉(zhuǎn)換為要格式化的對(duì)象。選項(xiàng)表示對(duì)浮點(diǎn)表示類型和整數(shù)表示類型使用下劃線作為千位分隔符。
上一篇文章:Python標(biāo)準(zhǔn)庫(kù)---17、內(nèi)置異常字符串常量
下一篇文章:Python標(biāo)準(zhǔn)庫(kù)---19、文本處理服務(wù):re正則表達(dá)式操作
此模塊中定義的常量為:
string.ascii_letters
下文所述 ascii_lowercase 和 ascii_uppercase 常量的拼連。 該值不依賴于語言區(qū)域。
string.ascii_lowercase
小寫字母 "abcdefghijklmnopqrstuvwxyz"。 該值不依賴于語言區(qū)域,不會(huì)發(fā)生改變。
string.ascii_uppercase
大寫字母 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"。 該值不依賴于語言區(qū)域,不會(huì)發(fā)生改變。
string.digits
字符串 "0123456789"。
string.hexdigits
字符串 "0123456789abcdefABCDEF"。
string.octdigits
字符串 "01234567"。
string.punctuation
由在 C 語言區(qū)域中被視為標(biāo)點(diǎn)符號(hào)的 ASCII 字符組成的字符串。
string.printable
由被視為可打印符號(hào)的 ASCII 字符組成的字符串。 這是 digits, ascii_letters, punctuation 和 whitespace 的總和。
string.whitespace
由被視為空白符號(hào)的 ASCII 字符組成的字符串。 其中包括空格、制表、換行、回車、進(jìn)紙和縱向制表符。
自定義字符串格式化內(nèi)置的字符串類提供了通過使用 PEP 3101 所描述的 format() 方法進(jìn)行復(fù)雜變量替換和值格式化的能力。 string 模塊中的 Formatter 類允許你使用與內(nèi)置 format() 方法相同的實(shí)現(xiàn)來創(chuàng)建并定制你自己的字符串格式化行為。
class string.FormatterFormatter 類包含下列公有方法:
format(format_string, args, *kwargs)
首要的 API 方法。 它接受一個(gè)格式字符串和任意一組位置和關(guān)鍵字參數(shù)。 它只是一個(gè)調(diào)用 vformat() 的包裝器。 在 3.7 版更改: 格式字符串參數(shù)現(xiàn)在是 僅限位置參數(shù)。
vformat(format_string, args, kwargs)
此函數(shù)執(zhí)行實(shí)際的格式化操作。 它被公開為一個(gè)多帶帶的函數(shù),用于需要傳入一個(gè)預(yù)定義字母作為參數(shù),而不是使用 *args 和 **kwargs 語法將字典解包為多個(gè)多帶帶參數(shù)并重打包的情況。 vformat() 完成將格式字符串分解為字符數(shù)據(jù)和替換字段的工作。 它會(huì)調(diào)用下文所述的幾種不同方法。
此外,F(xiàn)ormatter 還定義了一些旨在被子類替換的方法:
parse(format_string)
循環(huán)遍歷 format_string 并返回一個(gè)由可迭代對(duì)象組成的元組 (literal_text, field_name, format_spec, conversion)。 它會(huì)被 vformat() 用來將字符串分解為文本字面值或替換字段。 元組中的值在概念上表示一段字面文本加上一個(gè)替換字段。 如果沒有字面文本(如果連續(xù)出現(xiàn)兩個(gè)替換字段就會(huì)發(fā)生這種情況),則 literal_text 將是一個(gè)長(zhǎng)度為零的字符串。 如果沒有替換字段,則 field_name, format_spec 和 conversion 的值將為 None。
get_field(field_name, args, kwargs)
給定 field_name 作為 parse() (見上文) 的返回值,將其轉(zhuǎn)換為要格式化的對(duì)象。 返回一個(gè)元組 (obj, used_key)。 默認(rèn)版本接受在 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 形參會(huì)被設(shè)為 vformat() 的位置參數(shù)列表,而 kwargs 形參會(huì)被設(shè)為由關(guān)鍵字參數(shù)組成的字典。 對(duì)于復(fù)合字段名稱,僅會(huì)為字段名稱的第一個(gè)組件調(diào)用這些函數(shù);后續(xù)組件會(huì)通過普通屬性和索引操作來進(jìn)行處理。 因此舉例來說,字段表達(dá)式 "0.name" 將導(dǎo)致調(diào)用 get_value() 時(shí)附帶 key 參數(shù)值 0。 在 get_value() 通過調(diào)用內(nèi)置的 getattr() 函數(shù)返回后將會(huì)查找 name 屬性。 如果索引或關(guān)鍵字引用了一個(gè)不存在的項(xiàng),則將引發(fā) IndexError 或 KeyError。
check_unused_args(used_args, args, kwargs)
在必要時(shí)實(shí)現(xiàn)對(duì)未使用參數(shù)進(jìn)行檢測(cè)。 此函數(shù)的參數(shù)是是格式字符串中實(shí)際引用的所有參數(shù)鍵的集合(整數(shù)表示位置參數(shù),字符串表示名稱參數(shù)),以及被傳給 vformat 的 args 和 kwargs 的引用。 未使用參數(shù)的集合可以根據(jù)這些形參計(jì)算出來。 如果檢測(cè)失敗則 check_unused_args() 應(yīng)會(huì)引發(fā)一個(gè)異常。
format_field(value, format_spec)
format_field() 會(huì)簡(jiǎn)單地調(diào)用內(nèi)置全局函數(shù) format()。 提供該方法是為了讓子類能夠重載它。
convert_field(value, conversion)
使用給定的轉(zhuǎn)換類型(來自 parse() 方法所返回的元組)來轉(zhuǎn)換(由 get_field() 所返回的)值。 默認(rèn)版本支持 "s" (str), "r" (repr) 和 "a" (ascii) 等轉(zhuǎn)換類型。格式字符串語法
str.format() 方法和 Formatter 類共享相同的格式字符串語法(雖然對(duì)于 Formatter 來說,其子類可以定義它們自己的格式字符串語法)。 具體語法與 格式化字符串字面值 相似,但也存在區(qū)別。
格式字符串包含有以花括號(hào) {} 括起來的“替換字段”。 不在花括號(hào)之內(nèi)的內(nèi)容被視為字面文本,會(huì)不加修改地復(fù)制到輸出中。 如果你需要在字面文本中包含花括號(hào)字符,可以通過重復(fù)來轉(zhuǎn)義: {{ and }}。
替換字段的語法如下:
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 ::=+ conversion ::= "r" | "s" | "a" format_spec ::=
用不太正式的術(shù)語來描述,替換字段開頭可以用一個(gè) field_name 指定要對(duì)值進(jìn)行格式化并取代替換字符被插入到輸出結(jié)果的對(duì)象。 field_name 之后有可選的 conversion 字段,它是一個(gè)感嘆號(hào) "!" 加一個(gè) format_spec,并以一個(gè)冒號(hào) ":" 打頭。 這些指明了替換值的非默認(rèn)格式。
另請(qǐng)參閱 格式規(guī)格迷你語言 一節(jié)。
field_name 本身以一個(gè)數(shù)字或關(guān)鍵字 arg_name 打頭。 如果為數(shù)字,則它指向一個(gè)位置參數(shù),而如果為關(guān)鍵字,則它指向一個(gè)命名關(guān)鍵字參數(shù)。 如果格式字符串中的數(shù)字 arg_names 為 0, 1, 2, ... 的序列,它們可以全部省略(而非部分省略),數(shù)字 0, 1, 2, ... 將會(huì)按順序自動(dòng)插入。 由于 arg_name 不使用引號(hào)分隔,因此無法在格式字符串中指定任意的字典鍵 (例如字符串 "10" 或 ":-]")。 arg_name 之后可以帶上任意數(shù)量的索引或?qū)傩员磉_(dá)式。 ".name" 形式的表達(dá)式會(huì)使用 getattr() 選擇命名屬性,而 "[index]" 形式的表達(dá)式會(huì)使用 __getitem__() 執(zhí)行索引查找。
在 3.1 版更改: 位置參數(shù)說明符對(duì)于 str.format() 可以省略,因此 "{} {}".format(a, b) 等價(jià)于 "{0} {1}".format(a, b)。
在 3.4 版更改: 位置參數(shù)說明符對(duì)于 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)行類型強(qiáng)制轉(zhuǎn)換。 通常,格式化值的工作由值本身的 __format__() 方法來完成。 但是,在某些情況下最好強(qiáng)制將類型格式化為一個(gè)字符串,覆蓋其本身的格式化定義。 通過在調(diào)用 __format__() 之前將值轉(zhuǎn)換為字符串,可以繞過正常的格式化邏輯。
目前支持的轉(zhuǎn)換旗標(biāo)有三種: "!s" 會(huì)對(duì)值調(diào)用 str(),"!r" 調(diào)用 repr() 而 "!a" 則調(diào)用 ascii()。
幾個(gè)例子:
"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 字段包含值應(yīng)如何呈現(xiàn)的規(guī)格描述,例如字段寬度、對(duì)齊、填充、小數(shù)精度等細(xì)節(jié)信息。 每種值類型可以定義自己的“格式化迷你語言”或?qū)?format_spec 的解讀方式。
大多數(shù)內(nèi)置類型都支持同樣的格式化迷你語言,具體描述見下一節(jié)。
format_spec 字段還可以在其內(nèi)部包含嵌套的替換字段。 這些嵌套的替換字段可能包括字段名稱、轉(zhuǎn)換旗標(biāo)和格式規(guī)格描述,但是不再允許更深層的嵌套。 format_spec 內(nèi)部的替換字段會(huì)在解讀 format_spec 字符串之前先被解讀。 這將允許動(dòng)態(tài)地指定特定值的格式。
請(qǐng)參閱 格式示例 一節(jié)查看相關(guān)示例。
格式規(guī)格迷你語言“格式規(guī)格”在格式字符串所包含的替換字段內(nèi)部使用,用于定義單個(gè)值應(yīng)如何呈現(xiàn) (參見 格式字符串語法 和 格式化字符串字面值)。 它們也可以被直接傳給內(nèi)置的 format() 函數(shù)。 每種可格式化的類型都可以自行定義如何對(duì)格式規(guī)格進(jìn)行解讀。
大多數(shù)內(nèi)置類型都為格式規(guī)格實(shí)現(xiàn)了下列選項(xiàng),不過某些格式化選項(xiàng)只被數(shù)值類型所支持。
一般約定空格式字符串 ("") 將產(chǎn)生與對(duì)值調(diào)用 str() 相同的結(jié)果。 非空格式字符串通常會(huì)修改這一結(jié)果。
標(biāo)準(zhǔn)格式說明符 的一般形式如下:
format_spec ::= [[fill]align][sign][#][0][width][grouping_option][.precision][type] fill ::=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 字符,它可以為任意字符,如果省略則默認(rèn)為空格符。 在 格式化字符串字面值 或在使用 str.format() 方法時(shí)是無法使用花括號(hào)字面值 ("{" or "}") 作為 fill 字符的。 但是,通過嵌套替換字段插入花括號(hào)則是可以的。 這個(gè)限制不會(huì)影響 format() 函數(shù)。
各種對(duì)齊選項(xiàng)的含義如下:
請(qǐng)注意,除非定義了最小字段寬度,否則字段寬度將始終與填充它的數(shù)據(jù)大小相同,因此在這種情況下,對(duì)齊選項(xiàng)沒有意義。
sign 選項(xiàng)僅對(duì)數(shù)字類型有效,可以是以下之一:
"#" 選項(xiàng)可以讓“替代形式”被用于轉(zhuǎn)換。 替代形式可針對(duì)不同類型分別定義。 此選項(xiàng)僅對(duì)整數(shù)、浮點(diǎn)、復(fù)數(shù)和 Decimal 類型有效。 對(duì)于整數(shù)類型,當(dāng)使用二進(jìn)制、八進(jìn)制或十六進(jìn)制輸出時(shí),此選項(xiàng)會(huì)為輸出值添加相應(yīng)的 "0b", "0o" 或 "0x" 前綴。 對(duì)于浮點(diǎn)數(shù)、復(fù)數(shù)和 Decimal 類型,替代形式會(huì)使得轉(zhuǎn)換結(jié)果總是包含小數(shù)點(diǎn)符號(hào),即使其不帶小數(shù)。 通常只有在帶有小數(shù)的情況下,此類轉(zhuǎn)換的結(jié)果中才會(huì)出現(xiàn)小數(shù)點(diǎn)符號(hào)。 此外,對(duì)于 "g" 和 "G" 轉(zhuǎn)換,末尾的零不會(huì)從結(jié)果中被移除。
"," 選項(xiàng)表示使用逗號(hào)作為千位分隔符。 對(duì)于感應(yīng)區(qū)域設(shè)置的分隔符,請(qǐng)改用 "n" 整數(shù)表示類型。
在 3.1 版更改: 添加了 "," 選項(xiàng) (另請(qǐng)參閱 PEP 378)。
"_" 選項(xiàng)表示對(duì)浮點(diǎn)表示類型和整數(shù)表示類型 "d" 使用下劃線作為千位分隔符。 對(duì)于整數(shù)表示類型 "b", "o", "x" 和 "X",將為每 4 個(gè)數(shù)位插入一個(gè)下劃線。 對(duì)于其他表示類型指定此選項(xiàng)則將導(dǎo)致錯(cuò)誤。
在 3.6 版更改: 添加了 "_" 選項(xiàng) (另請(qǐng)參閱 PEP 515)。
width 是一個(gè)定義最小字段寬度的十進(jìn)制整數(shù)。 如果未指定,則字段寬度將由內(nèi)容確定。
當(dāng)未顯式給出對(duì)齊方式時(shí),在 width 字段前加一個(gè)零 ("0") 字段將為數(shù)字類型啟用感知正負(fù)號(hào)的零填充。 這相當(dāng)于設(shè)置 fill 字符為 "0" 且 alignment 類型為 "="。
precision 是一個(gè)十進(jìn)制數(shù)字,表示對(duì)于以 "f" and "F" 格式化的浮點(diǎn)數(shù)值要在小數(shù)點(diǎn)后顯示多少個(gè)數(shù)位,或者對(duì)于以 "g" 或 "G" 格式化的浮點(diǎn)數(shù)值要在小數(shù)點(diǎn)前后共顯示多少個(gè)數(shù)位。 對(duì)于非數(shù)字類型,該字段表示最大字段大小 —— 換句話說就是要使用多少個(gè)來自字段內(nèi)容的字符。 對(duì)于整數(shù)值則不允許使用 precision。
最后,type 確定了數(shù)據(jù)應(yīng)如何呈現(xiàn)。
可用的字符串表示類型是:
可用的整數(shù)表示類型是:
在上述的表示類型之外,整數(shù)還可以通過下列的浮點(diǎn)表示類型來格式化 (除了 "n" 和 None)。 當(dāng)這樣做時(shí),會(huì)在格式化之前使用 float() 將整數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)。
浮點(diǎn)數(shù)和小數(shù)值可用的表示類型有:
格式示例本節(jié)包含 str.format() 語法的示例以及與舊式 % 格式化的比較。
該語法在大多數(shù)情況下與舊式的 % 格式化類似,只是增加了 {} 和 : 來取代 %。 例如,,"%03.2f" 可以被改寫為 "{:03.2f}"。
新的格式語法還支持新增的不同選項(xiàng),將在以下示例中說明。
按位置訪問參數(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ù)的項(xiàng):
>>> 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"
對(duì)齊文本以及指定寬度:
>>> "{:<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ù)號(hào):
>>> "{:+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)換基于不同進(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"
使用逗號(hào)作為千位分隔符:
>>> "{:,}".format(1234567890) "1,234,567,890"
表示為百分?jǐn)?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ù)以及更復(fù)雜的示例:
>>> 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è)主要用例是文本國(guó)際化 (i18n),因?yàn)樵诖藞?chǎng)景下,更簡(jiǎn)單的語法和功能使得文本翻譯過程比使用 Python 的其他內(nèi)置字符串格式化工具更為方便。 作為基于模板字符串構(gòu)建以實(shí)現(xiàn) i18n 的庫(kù)的一個(gè)示例,請(qǐng)參看 flufl.i18n 包。
模板字符串支持基于 $ 的替換,使用以下規(guī)則:
$$ 為轉(zhuǎn)義符號(hào);它會(huì)被替換為單個(gè)的 $。
$identifier 為替換占位符,它會(huì)匹配一個(gè)名為 "identifier" 的映射鍵。 在默認(rèn)情況下,"identifier" 限制為任意 ASCII 字母數(shù)字(包括下劃線)組成的字符串,不區(qū)分大小寫,以下劃線或 ASCII 字母開頭。 在 $ 字符之后的第一個(gè)非標(biāo)識(shí)符字符將表明占位符的終結(jié)。
${identifier} 等價(jià)于 $identifier。 當(dāng)占位符之后緊跟著有效的但又不是占位符一部分的標(biāo)識(shí)符字符時(shí)需要使用,例如 "${noun}ification"。
在字符串的其他位置出現(xiàn) $ 將導(dǎo)致引發(fā) ValueError。
string 模塊提供了實(shí)現(xiàn)這些規(guī)則的 Template 類。 Template 有下列方法:
class string.Template(template)該構(gòu)造器接受一個(gè)參數(shù)作為模板字符串。
substitute(mapping, **kwds)
執(zhí)行模板替換,返回一個(gè)新字符串。 mapping 為任意字典類對(duì)象,其中的鍵將匹配模板中的占位符。 或者你也可以提供一組關(guān)鍵字參數(shù),其中的關(guān)鍵字即對(duì)應(yīng)占位符。 當(dāng)同時(shí)給出 mapping 和 kwds 并且存在重復(fù)時(shí),則以 kwds 中的占位符為優(yōu)先。
safe_substitute(mapping, **kwds)
類似于 substitute(),不同之處是如果有占位符未在 mapping 和 kwds 中找到,不是引發(fā) KeyError 異常,而是將原始占位符不加修改地顯示在結(jié)果字符串中。 另一個(gè)與 substitute() 的差異是任何在其他情況下出現(xiàn)的 $ 將簡(jiǎn)單地返回 $ 而不是引發(fā) ValueError。 此方法被認(rèn)為“安全”,因?yàn)殡m然仍有可能發(fā)生其他異常,但它總是嘗試返回可用的字符串而不是引發(fā)一個(gè)異常。 從另一方面來說,safe_substitute() 也可能根本算不上安全,因?yàn)樗鼘㈧o默地忽略錯(cuò)誤格式的模板,例如包含多余的分隔符、不成對(duì)的花括號(hào)或不是合法 Python 標(biāo)識(shí)符的占位符等等。
Template 的實(shí)例還提供一個(gè)公有數(shù)據(jù)屬性:
template
這是作為構(gòu)造器的 template 參數(shù)被傳入的對(duì)象。 一般來說,你不應(yīng)該修改它,但并不強(qiáng)制要求只讀訪問。
以下是一個(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 的子類來自定義占位符語法、分隔符,或用于解析模板字符串的整個(gè)正則表達(dá)式。 為此目的,你可以重載這些類屬性:
delimiter -- 這是用來表示占位符的起始的分隔符的字符串字面值。 默認(rèn)值為 $。 請(qǐng)注意此參數(shù) 不能 為正則表達(dá)式,因?yàn)槠鋵?shí)現(xiàn)將在必要時(shí)對(duì)此字符串調(diào)用 re.escape()。 還要注意你不能在創(chuàng)建類之后改變此分隔符(例如在子類的類命名空間中必須設(shè)置不同的分隔符)。
idpattern -- 這是用來描述不帶花括號(hào)的占位符的模式的正則表達(dá)式。 默認(rèn)值為正則表達(dá)式 (?a:_a-z*)。 如果給出了此屬性并且 braceidpattern 為 None 則此模式也將作用于帶花括號(hào)的占位符。
注解由于默認(rèn)的 flags 為 re.IGNORECASE,模式 [a-z] 可以匹配某些非 ASCII 字符。 因此我們?cè)谶@里使用了局部旗標(biāo) a。
在 3.7 版更改: braceidpattern 可被用來定義對(duì)花括號(hào)內(nèi)部和外部進(jìn)行區(qū)分的模式。
braceidpattern -- 此屬性類似于 idpattern 但是用來描述帶花括號(hào)的占位符的模式。 默認(rèn)值 None 意味著回退到 idpattern (即在花括號(hào)內(nèi)部和外部使用相同的模式)。 如果給出此屬性,這將允許你為帶花括號(hào)和不帶花括號(hào)的占位符定義不同的模式。
3.7 新版功能.
flags -- 將在編譯用于識(shí)別替換內(nèi)容的正則表達(dá)式被應(yīng)用的正則表達(dá)式旗標(biāo)。 默認(rèn)值為 re.IGNORECASE。 請(qǐng)注意 re.VERBOSE 總是會(huì)被加為旗標(biāo),因此自定義的 idpattern 必須遵循詳細(xì)正則表達(dá)式的約定。
3.2 新版功能.
作為另一種選項(xiàng),你可以通過重載類屬性 pattern 來提供整個(gè)正則表達(dá)式模式。 如果你這樣做,該值必須為一個(gè)具有四個(gè)命名捕獲組的正則表達(dá)式對(duì)象。 這些捕獲組對(duì)應(yīng)于上面已經(jīng)給出的規(guī)則,以及無效占位符的規(guī)則:
escaped -- 這個(gè)組匹配轉(zhuǎn)義序列,在默認(rèn)模式中即 $$。
named -- 這個(gè)組匹配不帶花括號(hào)的占位符名稱;它不應(yīng)當(dāng)包含捕獲組中的分隔符。
braced -- 這個(gè)組匹配帶有花括號(hào)的占位符名稱;它不應(yīng)當(dāng)包含捕獲組中的分隔符或者花括號(hào)。
invalid -- 這個(gè)組匹配任何其他分隔符模式(通常為單個(gè)分隔符),并且它應(yīng)當(dāng)出現(xiàn)在正則表達(dá)式的末尾。
輔助函數(shù) string.capwords(s, sep=None)使用 str.split() 將參數(shù)拆分為單詞,使用 str.capitalize() 將單詞轉(zhuǎn)為大寫形式,使用 str.join() 將大寫的單詞進(jìn)行拼接。 如果可選的第二個(gè)參數(shù) sep 被省略或?yàn)?None,則連續(xù)的空白字符會(huì)被替換為單個(gè)空格符并且開頭和末尾的空白字符會(huì)被移除,否則 sep 會(huì)被用來拆分和拼接單詞。
上一篇文章:Python標(biāo)準(zhǔn)庫(kù)---17、內(nèi)置異常
下一篇文章:Python標(biāo)準(zhǔn)庫(kù)---19、文本處理服務(wù):re正則表達(dá)式操作
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/44076.html
摘要:關(guān)聯(lián)值通常會(huì)作為參數(shù)被傳遞給異常類的構(gòu)造器。所有內(nèi)置異常的基類。此異常僅用于非限定名稱。由內(nèi)置函數(shù)和的方法所引發(fā),用來表示該迭代器不能產(chǎn)生下一項(xiàng)。當(dāng)一個(gè)或函數(shù)返回時(shí),將引發(fā)一個(gè)新的實(shí)例,函數(shù)返回的值將被用作異常構(gòu)造器的形參。 上一篇文章:Python標(biāo)準(zhǔn)庫(kù)---16、內(nèi)置類型:上下文管理器類型、其他、特殊屬性下一篇文章:Python標(biāo)準(zhǔn)庫(kù)---18、文本處理服務(wù):string 常見的字...
摘要:前言以下簡(jiǎn)稱是數(shù)據(jù)分析必不可少的第三方庫(kù),的出現(xiàn)一定程度上解決了運(yùn)算性能不佳的問題,同時(shí)提供了更加精確的數(shù)據(jù)類型。因此,理解的數(shù)據(jù)類型對(duì)數(shù)據(jù)分析十分有幫助。一維數(shù)據(jù)由對(duì)等關(guān)系的有序或無序數(shù)據(jù)構(gòu)成,采用線性方式組織,可以用數(shù)組表示。 前言 NUMPY(以下簡(jiǎn)稱NP)是Python數(shù)據(jù)分析必不可少的第三方庫(kù),np的出現(xiàn)一定程度上解決了Python運(yùn)算性能不佳的問題,同時(shí)提供了更加精確的數(shù)據(jù)...
摘要:在前面我們講到了和的概念,我們向網(wǎng)站的服務(wù)器發(fā)送一個(gè),返回的的便是網(wǎng)頁(yè)源代碼。渲染頁(yè)面有時(shí)候我們?cè)谟没蜃ト【W(wǎng)頁(yè)時(shí),得到的源代碼實(shí)際和瀏覽器中看到的是不一樣的。所以使用基本請(qǐng)求庫(kù)得到的結(jié)果源代碼可能跟瀏覽器中的頁(yè)面源代碼不太一樣。 上一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---16、Web網(wǎng)頁(yè)基礎(chǔ)下一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---18、Session和Cookies 爬蟲,即網(wǎng)...
摘要:正則表達(dá)式使用反斜杠來表示特殊形式,或者把特殊字符轉(zhuǎn)義成普通字符。解決辦法是對(duì)于正則表達(dá)式樣式使用的原始字符串表示法在帶有前綴的字符串字面值中,反斜杠不必做任何特殊處理。為了避免警告,需要將它們用反斜杠轉(zhuǎn)義。 上一篇文章:Python標(biāo)準(zhǔn)庫(kù)---18、文本處理服務(wù):string 常見的字符串操作下一篇文章: 這個(gè)模塊提供了與 Perl 語言類似的正則表達(dá)式匹配操作。 模式和被搜索的字...
摘要:計(jì)算機(jī)中以字節(jié)為單位存儲(chǔ)和解釋信息,規(guī)定一個(gè)字節(jié)由八個(gè)二進(jìn)制位構(gòu)成,即個(gè)字節(jié)等于個(gè)比特。需要注意協(xié)議規(guī)定網(wǎng)絡(luò)字節(jié)序?yàn)榇蠖俗止?jié)序。以元組形式返回全部分組截獲的字符串。返回指定的組截獲的子串在中的結(jié)束索引子串最后一個(gè)字符的索引。 導(dǎo)語:本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之?dāng)?shù)據(jù)結(jié)構(gòu)篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來一起學(xué)習(xí)并交流。 本章重點(diǎn): 1、了解字符字節(jié)等概...
閱讀 1837·2021-09-23 11:21
閱讀 698·2019-08-30 15:55
閱讀 832·2019-08-29 15:40
閱讀 528·2019-08-29 12:56
閱讀 3158·2019-08-26 12:00
閱讀 3552·2019-08-23 18:24
閱讀 2246·2019-08-23 17:08
閱讀 1637·2019-08-23 17:03