string模块在很早的Python版本中就有了。之前这个模块中提供的不少函数已经移植为str对象的方法,不过这个模块仍保留了不少有用的常量和类来处理str对象。git
string.ascii_letters正则表达式
下文所述ascii_lowercase和ascii_uppercase常量的拼接。该值不依赖于语言区域。api
string.ascii_lowercase数组
小写字母‘abcdefghijklmnopqrstuvwxyz’。此值不依赖于语言环境,而且不会更改。安全
string.ascii_uppercaseapp
大写字母‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’。此值不依赖于语言环境,而且不会更改。ide
string.digits函数
字符串‘0123456789’。布局
string.hexdigitsui
字符串‘0123456789abcdefABCDEF’。
string.octdigits
字符串‘01234567’
string.punctuation
ASCII字符的字符串,在C
区域设置中被视为标点符号。
string.printable
视为可打印的ASCII字符字符串。这是一个组合digits,ascii_letters,punctuation和whitespace。
string.whitespace
一个字符串,其中包含全部被视为空格的ASCII字符。这包括字符空格,制表符,换行符,返回符,换页符和垂直制表符。
打印出string模块中的常量:
import inspect import string def is_str(value): return isinstance(value, str) for name, value in inspect.getmembers(string, is_str): if name.startswith('_'): continue print('%s=%r\n' % (name, value))
结果:
这些常量在处理ASCII数据时颇有用,可是因为以某种形式的Unicode遇到非ASCII文本愈来愈广泛,所以它们的应用受到限制。
Formatter类实现了与str的format()方法一样的布局规范语言。它的功能包括类型强制,对齐,属性和域引用、命名和位置模板参数以及特定于类型的格式设置选项。在大多数状况下,该format()方法都能更便利地访问这些特功能,不过也能够利用Formatter构建子类,以备须要改动的状况。
class string.Formatter
Formatter类包含下列公有方法:
*args
和
**kwargs
语法将字典解包为多个单独参数并重打包的状况。vformat()完成将格式字符串分解为字符数据和替换字段的工做。 它会调用下文所述的几种不一样方法。
此外,Formatter还定义了一些旨在被子类替换的方法:
IndexError
或
KeyError
。
format_field()会简单地调用内置全局函数format()。提供该方法是为了让子类可以重载它。
字符串模板是做为内置拼接语法的替代作法。使用string.Template拼接时,要在名字前加前缀$来标识变量(例如,${var}) 。
模板字符串支持基于$的替换,使用如下规则:
$$
为转义符号;它会被替换为单个的$
。
$identifier
为替换占位符,它会匹配一个名为"identifier"
的映射键。在默认状况下,"identifier"
限制为任意 ASCII 字母数字(包括下划线)组成的字符串,不区分大小写,如下划线或ASCII字母开头。在$
字符以后的第一个非标识符字符将代表占位符的终结。
${identifier}
等价于$identifier
。当占位符以后紧跟着有效的但又不是占位符一部分的标识符字符时须要使用,例如"${noun}ification"
。
在字符串的其余位置出现$将致使引起ValueError。
class string.Template(template)
该构造器接受一个参数做为模板字符串。
KeyError
异常,而是将原始占位符不加修改地显示在结果字符串中。另外一个与substitute()的差别是任何在其余状况下出现的
$
将简单地返回
$
而不是引起ValueError。
下面例子使用%操做符将简单模板与类似的字符串插值进行比较,并使用来比较新格式的字符串语法str.format()。
import string values = {'var': 'foo'} t = string.Template(""" Variable : $var Escape : $$ Variable in text: ${var}iable """) print('TEMPLATE:', t.substitute(values)) s = """ Variable : %(var)s Escape : %% Variable in text: %(var)siable """ print('INTERPOLATION:', s % values) s = """ Variable : {var} Escape : {{}} Variable in text: {var}iable """ print('FORMAT:', s.format(**values))
在前两种状况下,触发字符($
或%
)经过重复两次来进行转义。在格式化语法中,须要重复{
和}
来转义。
结果:
模板与字符串拼接或格式化的一个关键区别是,它不考虑参数的类型。值会转换为字符串,而将字符串插入结果中。这里没有提供格式化选项。例如,没法控制使用几位有效数字来表示一个浮点值。
可是,这样作的好处是,经过使用safe_substitute()方法,能够避免未能向模板提供所需的全部参数值时可能产生的异常。
import string values = {'var': 'foo'} t = string.Template("$var is here but $missing is not provided") try: print('substitute() :', t.substitute(values)) except KeyError as err: print('ERROR:', str(err)) print('safe_substitute():', t.safe_substitute(values))
因为value字典中没有missing的值,因此substitute()会产生一个KeyError。safe_substitute()则不一样,它不会抛出这个错误,而是会捕捉这个错误并保留文本中的变量表达式。
结果:
进阶用法:你能够派生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 -- 这个组匹配任何其余分隔符模式(一般为单个分隔符),而且它应当出如今正则表达式的末尾。
string.Template
能够经过调整用于在模板主体中查找变量名称的正则表达式模式来更改其默认语法。一种简单的方法是更改delimiter
和idpattern
类属性。
import string class MyTemplate(string.Template): delimiter = '%' idpattern = '[a-z]+_[a-z]+' template_text = ''' Delimiter : %% Replaced : %with_underscore Ignored : %notunderscored ''' d = { 'with_underscore': 'replaced', 'notunderscored': 'not replaced', } t = MyTemplate(template_text) print('Modified ID pattern:') print(t.safe_substitute(d))
在这个例子中,替换规则已经改变,定界符是%而不是$,并且变量名中间的某个位置必须包含一个下划线。模式%notunderscored不会被替换为任何字符串,所以它不包含下划线字符。
结果:
要完成更复杂的修改,能够覆盖pattern属性并定义一个全新的正则表达式。所提供的模式必须包含4个命名组,分别捕获转义定界符、命名变量、加括号的变量名和不合法的定界符模式。
import string t = string.Template('$var') print(t.pattern.pattern)
t.pattern的值是一个已编译正则表达式,不过能够经过它的pattern属性获得原来的字符串。
结果:
下面这个例子定义了一个新模式以建立一个新的模板类型,这个使用{{var}}做为变量语法。
import re import string class MyTemplate(string.Template): delimiter = '{{' pattern = r''' \{\{(?: (?P<escaped>\{\{)| (?P<named>[_a-z][_a-z0-9]*)\}\}| (?P<braced>[_a-z][_a-z0-9]*)\}\}| (?P<invalid>) ) ''' t = MyTemplate(''' {{{{ {{var}} ''') print('MATCHES:', t.pattern.findall(t.template)) print('SUBSTITUTED:', t.safe_substitute(var='replacement'))
必须分别提供named和braced模式,尽管它们其实是同样的。
结果:
string.capwords(s,sep=None)
使用str.split()将参数拆分为单词,使用str.capitalize()将单词转为大写形式,使用str.join()将大写的单词进行拼接。 若是可选的第二个参数 sep 被省略或为None,则连续的空白字符会被替换为单个空格符而且开头和末尾的空白字符会被移除,不然 sep 会被用来拆分和拼接单词。
import string s = 'The quick brown fox jumped over the lazy dog.' print(s) print(string.capwords(s))
结果: