首页 > 代码库 > python string.md

python string.md

string

包含用于处理文本的常量和类。string模块始于Python的最早版本. 2.0版本中, 许多之前只在模块中实现的函数被转移为string对象的方法. 之后的版本中, 虽然这些函数仍然可用, 但是不推荐使用, 并且在Python 3.0中将被去掉. string模块也包含了一些有用的常量和类来处理字符串和unicode对象, 后面的讨论会集中在这个方面.

Functions

  • string.capwords(s, sep=None):使用str.split()将参数分成单词,使用str.capitalize()大写每个单词,并使用str.join()。如果可选的第二个参数sep不存在或None,空格字符将被单个空格替换,前导和尾随空格将被删除,否则sep 用于拆分和连接字。

举例
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.

Templates

字符串模板是作为PEP 292的一部分添加的,目的是作为内置插值语法的替代。 若使用了 string.Template 的占位符, 前缀为$的单词就被认为是变量(如$var), 如果需要将其在上下文中区别出来的话, 也可以将变量名包括在大括号中(如${var}).
class string.Template(template):构造函数采用单个参数即模板字符串。

  • substitute(mapping, **kwds):执行模板替换,返回一个新字符串。映射是任何类似于字典对象与键匹配的模板中的占位符。或者,您可以提供关键字参数,这些关键字在哪里的占位符。当给定映射和kwds并且存在重复时,来自kwds的占位符优先。
  • safe_substitute(mapping, **kwds):像substitute(),除了如果映射和kwds缺少占位符,而不是引发KeyError异常,原始占位符将出现在生成的字符串中。此外,与substitute()不同,$的任何其他外观将简单地返回$,而不是提高ValueError 。
    虽然其他例外情况仍然可能发生,但这种方法称为"安全"因为替换总是试图返回一个可用的字符串,而不是引发异常。在另一种意义上,safe_substitute()可能是安全之外的任何东西,因为它会默默地忽略包含悬挂分隔符,不匹配的大括号或不是有效的Python标识符的占位符的畸形模板。

举例
本例将使用%运算符和使用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

Advanced Templates

高级用法:您可以派生Template的子类来自定义占位符语法,定界符字符或用于解析模板字符串的整个正则表达式。若要做到这一点,可以重写这些类的属性:

  • delimiter —— 这是描述占位符引入分隔符的文字字符串。默认值为$。注意,这不应该是正则表达式,因为实现将根据需要调用re.escape()。
  • idpattern - 这是描述非支撑占位符模式的正则表达式(大括号会根据需要自动添加)。默认值为正则表达式[_a-z][_a-z0-9]*
  • flags - 在编译用于识别替换的正则表达式时应用的正则表达式标志。默认值为re.IGNORECASE。请注意,re.VERBOSE将始终添加到标记中,因此自定义idpattern必须遵守详细正则表达式的约定。

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

  • 转义 - 此组与转义序列匹配,例如$$。
  • 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 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

Formatter类实现了与str的format()方法相同的布局规范语言,它的特性包括类型强制、对齐、属性和字段引用、命名和位置模板参数,以及特定于类型的格式化选项。大多数时候,format()方法是这些特性的一个更方便的接口,但Formatter被作为一种构建子类的方式,对于需要变化的情况。

Constants

字符串模块包括一些与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‘

python string.md