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 来拆分和连接单词。