string ---常用字符串操作

源代码: Lib/string.py


参见

文本序列类型--- str

字符串方法

字符串常量

此模块中定义的常量为:

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

ASCII字符的字符串,在 C 场所: !"#$%&'()*+,-./:;<=>?@[\]^_`{{|}}~ .

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 版更改: 格式字符串参数现在为 positional-only .

vformat(format_string, args, kwargs)

这个函数完成格式化的实际工作。它作为一个单独的函数公开,用于希望传递预定义的参数字典的情况,而不是使用 *args**kwargs 语法。 vformat() 将格式字符串拆分为字符数据和替换字段的工作。它调用下面描述的各种方法。

此外, Formatter 定义要由子类替换的许多方法:

parse(format_string)

循环转换格式字符串并返回一个元组的iterable( literal_textfield_nameformat_spec转换 )这是由 vformat() 将字符串拆分为文本或替换字段。

元组中的值在概念上表示一个文本范围,后跟一个替换字段。如果没有文本(如果连续出现两个替换字段,则可能发生这种情况),则 literal_text 将是零长度字符串。如果没有替换字段,则 field_nameformat_spec转换None .

get_field(field_name, args, kwargs)

鉴于 field_name 由返回 parse() (见上文),将其转换为要格式化的对象。返回一个元组(obj,used_key)。默认版本采用在 PEP 3101 ,比如“0” [name] “或”label.title“。 args关键字参数 被传给 vformat() . 返回值 used_keykey 参数到 get_value() .

get_value(key, args, kwargs)

检索给定的字段值。这个 key 参数将是整数或字符串。如果是整数,则表示中位置参数的索引 args ;如果是字符串,则表示 关键字参数 .

这个 args 参数设置为位置参数列表 vformat()关键字参数 参数设置为关键字参数的字典。

对于复合字段名,仅对字段名的第一个组件调用这些函数;随后的组件通过普通属性和索引操作进行处理。

例如,字段表达式“0.name”将导致 get_value() 用一个 key 0的参数。这个 name 属性将在之后查找 get_value() 通过调用内置的 getattr() 功能。

如果索引或关键字引用了不存在的项,则 IndexErrorKeyError 应该提高。

check_unused_args(used_args, args, kwargs)

如果需要,实现对未使用参数的检查。此函数的参数是格式字符串中实际引用的所有参数键的集合(位置参数的整数,命名参数的字符串),以及对 args关键字参数 那是传给vformat的。可以根据这些参数计算未使用的参数集。 check_unused_args() 假设在检查失败时引发异常。

format_field(value, format_spec)

format_field() 只需调用全球 format() 内置。提供方法以便子类可以重写它。

convert_field(value, conversion)

转换值(返回者为 get_field() )给定的转换类型(如 parse() 方法)。默认版本理解“s”(str)、“r”(repr)和“a”(ascii)转换类型。

格式字符串语法

这个 str.format() 方法与 Formatter 类共享格式字符串的相同语法(尽管在 Formatter ,子类可以定义自己的格式字符串语法)。语法与 formatted string literals 但也有区别。

格式字符串包含由大括号包围的“替换字段” {{}} . 不包含在大括号中的任何内容都被视为文本,它将原封不动地复制到输出中。如果需要在文本中包含大括号字符,则可以通过加倍对其进行转义: {{{{}}}} .

替换字段的语法如下:

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       ::=  <described in the next section>

在不太正式的术语中,替换字段可以从 field_name 指定要格式化其值并将其插入输出而不是替换字段中的对象。这个 field_name 后面可选 转换 字段,前面是感叹号 '!' 和A format_spec ,前面是冒号 ':' . 它们为替换值指定非默认格式。

也见 格式规范小型语言 部分。

这个 field_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'.

这个 转换 字段在格式化前导致类型强制。通常,格式化值的工作由 __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 .

大多数内置类型都支持一种通用的格式化迷你语言,这将在下一节中介绍。

A format_spec 字段中还可以包含嵌套的替换字段。这些嵌套的替换字段可能包含字段名、转换标志和格式规范,但不允许进行更深层次的嵌套。格式“spec”中的替换字段在 format_spec 字符串被解释。这允许动态指定值的格式。

格式化实例 部分以获取一些示例。

格式规范小型语言

“格式规范”用于在格式字符串中包含的替换字段中定义各个值的显示方式(请参见 格式字符串语法格式化字符串文本 )它们也可以直接传递给内置的 format() 功能。每个格式表类型都可以定义如何解释格式规范。

大多数内置类型为格式规范实现以下选项,尽管某些格式选项仅受数字类型支持。

一般惯例是,空格式规范产生的结果与调用 str() 关于价值。非空格式规范通常修改结果。

A的一般形式 标准格式说明符 是:

format_spec     ::=  [[fill]align][sign][#][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" | "%"

如果有效 排列 值的前面可以是 fill 可以是任何字符的字符,如果省略,则默认为空格。不可能使用文字大括号(“` ```或` ` `)”)作为 fill A中的字符 formatted string literal 或者当使用 str.format() 方法。但是,可以使用嵌套的替换字段插入大括号。此限制不影响 format() 功能。

各种对齐选项的含义如下:

期权

意义

'<'

强制字段在可用空间内保持对齐(这是大多数对象的默认设置)。

'>'

强制字段在可用空间内右对齐(这是数字的默认值)。

'='

强制将填充放置在符号(如果有)之后、数字之前。这用于打印‘+000000120’形式的字段。此对齐选项仅对数值类型有效。当‘0’紧接在字段宽度之前时,它将成为数字的默认值。

'^'

强制字段在可用空间内居中。

请注意,除非定义了最小字段宽度,否则字段宽度将始终与要填充的数据大小相同,因此在这种情况下,对齐选项没有意义。

这个 sign 选项仅对数字类型有效,并且可以是以下类型之一:

期权

意义

'+'

指示正负数字都应使用符号。

'-'

指示符号只能用于负数(这是默认行为)。

空间

指示应在正数上使用前导空格,在负数上使用减号。

这个 '#' 选项使“替代形式”用于转换。对于不同的类型,替换形式的定义是不同的。此选项仅对整型、浮点型和复杂类型有效。对于整数,当使用二进制、八进制或十六进制输出时,此选项会分别添加前缀 '0b''0o' ,或 '0x' 转换为输出值。对于FLOAT和COMPLE,备用形式会导致转换结果始终包含小数点字符,即使后面没有数字也是如此。通常,只有在小数点字符后面跟有数字时,小数点字符才会出现在这些转换的结果中。此外,对于 'g''G' 转换时,不会从结果中删除尾随零。

这个 ',' 选项表示使用逗号作为千位分隔符。对于支持区域设置的分隔符,请使用 'n' 改为整数表示类型。

在 3.1 版更改: 增加了 ',' 选项(另请参见 PEP 378

这个 '_' 选项表示对浮点数表示类型和整型表示类型的千位分隔符使用下划线。 'd' . 对于整数表示类型 'b''o''x''X' ,下划线将每隔4位插入。对于其他演示文稿类型,指定此选项是错误的。

在 3.6 版更改: 增加了 '_' 选项(另请参见 PEP 515

宽度 定义最小字段总宽度的十进制整数,包括任何前缀、分隔符和其他格式字符。如果未指定,则字段宽度将由内容确定。

当没有给出显式对齐时,在 宽度 零域 ('0' )字符为数字类型启用符号识别零填充。这相当于 fill 特性 '0' 用一个 对准 类型 '=' .

在 3.10 版更改: 宽度 字段依据 '0' 不再影响字符串的默认对齐方式。

这个 精度 是一个十进制数字,指示浮点值的小数点后应显示多少位数,格式为 'f''F' ,或在小数点之前和之后使用 'g''G' . 对于非数字类型,字段指示最大字段大小——换句话说,字段内容将使用多少字符。这个 精度 整数值不允许使用。

最后, type 确定应如何显示数据。

可用的字符串表示类型包括:

类型

意义

's'

字符串格式。这是字符串的默认类型,可以省略。

没有

一样 's' .

可用的整数表示类型为:

类型

意义

'b'

二进制格式。以2为基数输出数字。

'c'

性格。打印前将整数转换为相应的Unicode字符。

'd'

十进制整数。以10为基数输出数字。

'o'

八进制格式。以8为基数输出数字。

'x'

十六进制格式。输出以16为基数的数字,对9以上的数字使用小写字母。

'X'

十六进制格式。输出以16为基数的数字,对9以上的数字使用大写字母。

'n'

号码。这和 'd' ,但它使用当前的区域设置插入适当的数字分隔符字符。

没有

一样 'd' .

除了上述表示类型外,整数还可以使用下面列出的浮点表示类型进行格式化(除了 'n'None )这样做时, float() 用于在格式化前将整数转换为浮点数。

的可用演示文稿类型 floatDecimal 值包括:

类型

意义

'e'

科学记数法。对于给定的精度 p ,用字母‘e’分隔系数和指数,以科学记数法格式化数字。该系数在AND之前有一个数字 p 小数点后的数字,总共为 p + 1 有效数字。在没有给定精度的情况下,使用的精度为 6 的小数点后的数字。 float ,并显示 Decimal 。如果小数点后面没有数字,则也会删除小数点,除非 # 选项。

'E'

科学记数法。相同于 'e' 除非它使用大写的“E”作为分隔符。

'f'

定点记数法。对于给定的精度 p ,将数字格式化为十进制数, p 小数点后的数字。在没有给定精度的情况下,使用的精度为 6 的小数点后的数字。 float ,并使用足够大的精度来显示 Decimal 。如果小数点后面没有数字,则也会删除小数点,除非 # 选项。

'F'

定点符号。等同于 'f' 但转换 nanNANinfINF .

'g'

常规格式。对于给定的精度 p >= 1 ,则将数字四舍五入为 p 有效数字,然后将结果格式化为定点格式或科学记数法,具体取决于其大小。精确度为 0 被视为等同于 1

具体规则如下:假设结果格式化为表示类型 'e' 精密度 p-1 会有指数 exp . 那么,如果 m <= exp < p 在哪里 m 浮点数是-4,浮点数是-6 Decimals ,数字格式为演示文稿类型 'f' 精密度 p-1-exp . 否则,该数字的格式为演示文稿类型 'e' 精密度 p-1 . 在这两种情况下,都会从有效位中删除不重要的尾随零,如果后面没有剩余的数字,小数点也会被删除,除非 '#' 使用选项。

在没有给定精度的情况下,使用的精度为 6 的有效数字 float 。为 Decimal ,结果的系数由值的系数位组成;小于以下的值使用科学记数法 1e-6 绝对值和最低有效位的位值大于1的值,否则使用定点记数法。

正负无穷大、正负零和NaN的格式为 inf-inf0-0nan 不管精度如何。

'G'

常规格式。等同于 'g' 除了切换到 'E' 如果数字太大。无穷大和NaN的表示也是大写的。

'n'

号码。这和 'g' ,但它使用当前的区域设置插入适当的数字分隔符字符。

'%'

百分比。将数字乘以100,并以固定格式显示 ('f' )格式,后跟百分号。

没有

float 这与以下内容相同 'g' ,但在使用定点表示法格式化结果时,它始终包含小数点后至少一个数字。所使用的精度与忠实地表示给定值所需的精度一样大。

Decimal ,这与任一项相同 'g''G' 取决于 context.capitals 用于当前的小数上下文。

总体效果是与以下各项的输出相匹配 str() 如由其他格式修饰符改变的。

格式化实例

本节包含 str.format() 句法及与旧的比较 % -格式化。

在大多数情况下,语法与旧的相似 %-formatting, with the addition of the {{}} and with : used instead of `` %`。例如, '%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)

执行模板替换,返回新字符串。 映射 是具有匹配模板中占位符的键的任何类似字典的对象。或者,您可以提供关键字参数,其中关键字是占位符。当两者 映射kwds 给出了并且存在重复项,占位符来自 kwds 优先考虑。

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

类似于 substitute() ,但如果缺少占位符, 映射kwds ,而不是提高 KeyError 异常,原始占位符将完整显示在结果字符串中。而且,与 substitute() ,任何其他的 $ 只会回来 $ 而不是提高 ValueError .

当其他异常仍然可能发生时,此方法被称为“safe”,因为它总是尝试返回可用的字符串而不是引发异常。在另一个意义上, safe_substitute() 可能不是安全的,因为它将静默地忽略格式错误的模板,这些模板包含悬挂分隔符、不匹配的大括号或不是有效的Python标识符的占位符。

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 自定义用于分析模板字符串的占位符语法、分隔符或整个正则表达式。为此,可以重写这些类属性:

  • 定界符 --这是描述引入分隔符的占位符的文本字符串。默认值为 $ .注意这应该 not 是正则表达式,因为实现将调用 re.escape() 根据需要在此字符串上。请进一步注意,创建类后不能更改分隔符(即,必须在子类的类命名空间中设置不同的分隔符)。

  • ID-模式 --这是描述无支撑占位符模式的正则表达式。默认值是正则表达式 (?a:[_a-z][_a-z0-9]*) . 如果给出了这个,并且 括号模式None 此模式也适用于带支撑的占位符。

    注解

    违约后 flagsre.IGNORECASE ,模式 [a-z] 可以与一些非ASCII字符匹配。这就是为什么我们使用本地 a 这里是国旗。

    在 3.7 版更改: 括号模式 可用于定义大括号内外使用的单独模式。

  • 括号模式 ——这就像 ID-模式 但是描述了支撑占位符的模式。默认为 None 这意味着回到 ID-模式 (也就是说,相同的模式用于内部和外部支撑)。如果给定,这允许您为有支撑和无支撑的占位符定义不同的模式。

    3.7 新版功能.

  • flags --在编译用于识别替换的正则表达式时将应用的正则表达式标志。默认值为 re.IGNORECASE .注意 re.VERBOSE 将始终添加到标志中,因此自定义 ID-模式 s必须遵循详细正则表达式的约定。

    3.2 新版功能.

或者,可以通过重写class属性来提供整个正则表达式模式。 模式 . 如果这样做,该值必须是具有四个命名捕获组的正则表达式对象。捕获组与上面给出的规则以及无效的占位符规则相对应:

  • 逃脱 --此组与转义序列匹配,例如 $$ ,在默认模式中。

  • 已命名 --此组与未标记的占位符名称匹配;它不应在捕获组中包含分隔符。

  • 支撑的 --此组与括号内的占位符名称匹配;它不应在捕获组中包含分隔符或括号。

  • 无效 --此组与任何其他分隔符模式(通常是单个分隔符)匹配,它应该出现在正则表达式的最后一个。

帮助程序函数

string.capwords(s, sep=None)

使用将参数拆分为单词 str.split() ,使用大写每个单词 str.capitalize() ,并使用 str.join() . 如果可选的第二个参数 sep 缺席或 None ,运行的空白字符将替换为单个空格,并删除前导空格和尾随空格,否则 sep 用于拆分和联接单词。