标签:重写类 生成 高级 ram lan space 不同 一点 isp
包含用于处理文本的常量和类。string模块始于Python的最早版本. 2.0版本中, 许多之前只在模块中实现的函数被转移为string对象的方法. 之后的版本中, 虽然这些函数仍然可用, 但是不推荐使用, 并且在Python 3.0中将被去掉. string模块也包含了一些有用的常量和类来处理字符串和unicode对象, 后面的讨论会集中在这个方面.
举例
capwords()将一个字符串所有单词首字母大写.
import string
s = ‘The quick brown fox jumped over the lazy dog.‘
print(s)
print(string.capwords(s))
得到的结果和调用split(), 将结果列表中的每个单词首字母大写, 然后调用join()连接这些单词这一系列动作的结果相同.
The quick brown fox jumped over the lazy dog.
The Quick Brown Fox Jumped Over The Lazy Dog.
字符串模板是作为PEP 292的一部分添加的,目的是作为内置插值语法的替代。 若使用了 string.Template 的占位符, 前缀为$的单词就被认为是变量(如$var), 如果需要将其在上下文中区别出来的话, 也可以将变量名包括在大括号中(如${var}).
class string.Template(template):构造函数采用单个参数即模板字符串。
举例
本例将使用%运算符和使用str.format()的新格式字符串语法比较简单的模板和类似的字符串插值。
import string
values = {‘var‘: ‘foo‘}
t = string.Template("""
Variable : $var
Escape : $$
Variable in next: ${var}iable
""")
print(‘TEMPLATE:‘, t.substitute(values))
s = """
Variable : %(var)s
Escape : %%
Variable in next: %(var)siable
"""
print(‘INTERPOLATION:‘, s % values)
s = """
Variable : {var}
Escape : {{}}
Variable in next: {var}iable
"""
print(‘FORMAT:‘, s.format(**values))
在前两种情况中,触发器字符($或%)通过重复两次来转义。对于格式语法,两者都需要通过重复它们来转义。
TEMPLATE:
Variable : foo
Escape : $
Variable in next: fooiable
INTERPOLATION:
Variable : foo
Escape : %
Variable in next: fooiable
FORMAT:
Variable : foo
Escape : {}
Variable in next: fooiable
模板和字符串插值或格式之间的一个关键区别在于,参数的类型没有考虑进去。值被转换为字符串,字符串被插入到结果中。没有可用的格式化选项。例如,无法控制用于表示浮点值的数字的数量。
而使用模板的一个好处是调用 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_subsitute():‘, t.safe_substitute(values))
因为missing这个变量的值没有出现在参数字典里, 所以 substitue() 会引发一个KeyError异常. 而 safe_substitute() 则捕获了这个异常并将这个变量表达式保留在文本中.
ERROR: ‘missing‘
safe_subsitute(): foo is here but $missing is not provided
高级用法:您可以派生Template的子类来自定义占位符语法,定界符字符或用于解析模板字符串的整个正则表达式。若要做到这一点,可以重写这些类的属性:
[_a-z][_a-z0-9]*
或者,您可以通过重写类属性模式提供整个正则表达式模式。如果你这样做,值必须是一个具有四命名捕获组的正则表达式对象。捕获组对应于上面,以及无效的占位符规则给出的规则:
举例
如果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 relaced‘,
}
t = MyTemplate(template_text)
print(‘Modified ID pattern:‘)
print(t.safe_substitute(d))
在本例中,替换规则被更改,因此分隔符是%而不是$,变量名必须在中间的某个地方包含一个下划线。 %notunderscored的模式不会被任何东西所取代,因为它不包含下划线字符。
Modified ID pattern:
Delimiter : %
Replaced : replaced
Ignored : %notunderscored
对于更复杂的更改,可以覆盖模式属性并定义一个全新的正则表达式。所提供的模式必须包含四个命名组,用于捕获已转义的分隔符、命名变量、变量名的加固版本和无效的分隔符模式。
import string
t = string.Template(‘$var‘)
print(t.pattern.pattern)
因为t.pattern是已经被编译的正则表达式, 我们只能通过它的pattern属性来看真实的字符串.
\$(?:
(?P<escaped>\$) | # Escape sequence of two delimiters
(?P<named>[_a-z][_a-z0-9]*) | # delimiter and a Python identifier
{(?P<braced>[_a-z][_a-z0-9]*)} | # delimiter and a braced identifier
(?P<invalid>) # Other ill-formed delimiter exprs
)
如果希望创建一个新的模板, 如, 以{{var}}作为变量表达式, 可以使用这样的一个pattern:
import string
import re
class MyTemlate(string.Template):
delimiter = ‘{{‘
pattern = r‘‘‘
\{\{(?:
(?P<escaped>\{\{)|
(?P<named>[_a-z][_a-z0-9]*)\}\}|
(?P<braced>[_a-z][_a-z0-9]*)\}\}|
(?P<invalid>)
)
‘‘‘
t = MyTemlate(‘‘‘
{{{{
{{var}}
‘‘‘)
print(‘MATCHES:‘, t.pattern.findall(t.template))
print(‘SUBSTITUTED:‘, t.safe_substitute(var=‘replaceent‘))
即使named和braced模式是一样的, 仍然需要必须单独提供. 下面是输出:
MATCHES: [(‘{{‘, ‘‘, ‘‘, ‘‘), (‘‘, ‘var‘, ‘‘, ‘‘)]
SUBSTITUTED:
{{
replaceent
Formatter类实现了与str的format()方法相同的布局规范语言,它的特性包括类型强制、对齐、属性和字段引用、命名和位置模板参数,以及特定于类型的格式化选项。大多数时候,format()方法是这些特性的一个更方便的接口,但Formatter被作为一种构建子类的方式,对于需要变化的情况。
字符串模块包括一些与ASCII和数字字符集相关的常量。
import string
import inspect
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文本越来越常见,所以它们的应用程序是有限的。
ascii_letters=‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ‘
ascii_lowercase=‘abcdefghijklmnopqrstuvwxyz‘
ascii_uppercase=‘ABCDEFGHIJKLMNOPQRSTUVWXYZ‘
digits=‘0123456789‘
hexdigits=‘0123456789abcdefABCDEF‘
octdigits=‘01234567‘
printable=‘0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\‘()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c‘
punctuation=‘!"#$%&\‘()*+,-./:;<=>?@[\\]^_`{|}~‘
whitespace=‘ \t\n\r\x0b\x0c‘
标签:重写类 生成 高级 ram lan space 不同 一点 isp
原文地址:http://www.cnblogs.com/cuchadanfan/p/7246363.html