详解Python中string模块除去Str还剩下什么

小岛来信
小岛来信
发布时间:2026-10-14 | 5人浏览过
原创

本文深入解析Python标准库string模块,探讨在大量功能迁移至内置str类后,该模块仍保留的核心价值。重点介绍capwords()函数的用法、Template类的字符串插值机制(包括safe_substitute与自定义正则表达式)、Formatter类的格式控制,以及ASCII相关常量。通过代码示例展示如何处理文本常量、模板替换及高级模式定制,帮助开发者充分利用这一经典模块。

string模块概述

Python的string模块历史悠久,可追溯至早期版本。尽管许多原本在此模块中实现的功能已迁移至内置的str类型,但该模块仍保留了一些实用的常量和类,专门用于处理字符串对象。

字符串常量与模板

该模块的主要目的是提供用于处理文本的常量及类。

字符串处理功能

功能

capwords()函数可将字符串中的所有单词首字母大写。参考代码string_capwords.py。


import string

s = 'The quick brown fox jumped over the lazy dog.'

print(s)
print(string.capwords(s))

其实现逻辑大致等同于先调用split()分割字符串,将结果列表中的单词进行大写转换,最后再调用join()将结果拼接起来。


$ python3 string_capwords.py

The quick brown fox jumped over the lazy dog.
The Quick Brown Fox Jumped Over The Lazy Dog.

字符串模板与插值

模板

字符串模板作为PEP 292规范中内置插值语法的替代方案。使用string.Template进行插值时,变量通常通过在名称前添加$符号来标识(例如$var)。若需使用花括号语法,也可采用${var}的形式。


#字符串模板

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))

在前两种情况($和%)中,触发字符($或%)需通过重复两次来转义。对于.format()格式语法,{和}同样需要通过重复它们来转义。


$ python3 string_template.py

TEMPLATE:
Variable    : foo
Escape     : $
Variable in text: fooiable

INTERPOLATION:
Variable    : foo
Escape     : %
Variable in text: fooiable

FORMAT:
Variable    : foo
Escape     : {}
Variable in text: fooiable

模板与字符串内插或格式化之间的一个关键区别在于,参数的类型不会被考虑。值会被转换为字符串并插入结果中,且没有可用的格式设置选项。例如,无法控制用于表示浮点值的数字位数。

不过,使用safe_substitute()方法有一个好处:如果未以参数形式提供模板所需的所有值,它可以避免抛出异常。


#字符串模板丢失.py

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))

当值字典中缺少missing键时,substitute()会引发KeyError。

相比之下,safe_substitute()会捕获该错误,并将变量表达式原样保留在文本中。


$ python3 string_template_missing.py

ERROR: 'missing'
safe_substitute(): foo is here but $missing is not provided

高级模板定制

高级模板

可以通过调整用于在模板正文中查找变量名称的正则表达式模式来更改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不会被任何内容替换,因为它不包含下划线字符。


$ python3 string_template_advanced.py

Modified ID pattern:

 Delimiter : %
 Replaced : replaced
 Ignored  : %notunderscored

对于更复杂的更改,可以重写pattern属性并定义一个全新的正则表达式。

提供的模式必须包含四个命名组,分别用于捕获转义分隔符、命名变量、带花括号的变量名以及无效的分隔符模式。


#字符串模板_defaultpattern.py

import string

t = string.Template('$var')
print(t.pattern.pattern)

值t.pattern是已编译的正则表达式,但原始字符串可通过其pattern属性获取。


\$(?:
 (?P<escaped>\$) |        # two delimiters
 (?P<named>[_a-z][_a-z0-9]*)  | # identifier
 {(?P<braced>[_a-z][_a-z0-9]*)} | # braced identifier
 (?P<invalid>)          # ill-formed delimiter exprs
)

此示例定义了一个新模式,以创建一种使用{{var}}作为变量语法的新类型模板。


#字符串模板_newsyntax.py

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模式都必须单独提供,即使它们相同。运行示例程序将生成以下输出:


$ python3 string_template_newsyntax.py

MATCHES: [('{{', '', '', ''), ('', 'var', '', '')]
SUBSTITUTED:
{{
replacement

Formatter与常量

格式化程序

Formatter类实现了与str.format()方法类似的功能。其功能包括类型强制、对齐、属性和字段引用、命名和位置模板参数以及特定于类型的格式选项。大多数时候,format()方法是这些特性的更方便接口,但Formatter作为构建子类的一种方法,用于需要变体的情况下。

常数

string模块包含一些与ASCII和数字字符集相关的常量。


#字符串常数.py

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文本越来越常见,因此它们的应用受到限制。


$ python3 string_constants.py

ascii_letters='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW
XYZ'

ascii_lowercase='abcdefghijklmnopqrstuvwxyz'

ascii_uppercase='ABCDEFGHIJKLMNOPQRSTUVWXYZ'

digits='0123456789'

hexdigits='0123456789abcdefABCDEF'

octdigits='01234567'

printable='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ
RSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'

punctuation='!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

whitespace=' \t\n\r\x0b\x0c'

到此这篇关于详解Python中string模块除去Str还剩下什么的文章就介绍到这了,更多相关Python string模块内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表