大数跨境
0
0

【python序列】string(字符串) — 文本常量和模板

【python序列】string(字符串) — 文本常量和模板 我爱数据科学
2025-09-13
0
导读:目的:包含用于处理文本的常量和类。string 模块源自 Python 的早期版本。

目的:包含用于处理文本的常量和类。

string 模块源自 Python 的早期版本。过去在此模块中实现的许多函数现在已被移至 str 对象的方法中。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.

模板

字符串模板(String Templates)作为 PEP 292 的一部分被引入,旨在提供一种替代内置插值语法的方法。在 string.Template 插值中,变量通过在变量名前添加 $ 符号来标识(例如,$var)。或者,如果需要将变量与周围文本区分开,也可以用花括号将其括起来(例如,${var})。

此示例比较了一个简单的模板与使用 % 操作符的类似字符串插值,以及使用 str.format() 的新格式化字符串语法。

string_template.py

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

在前两种情况下,触发字符($ 或 %)通过重复两次来转义。对于格式化语法,{ 和 } 都需要通过重复来转义。

$ 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() 方法可以在模板所需的所有值未全部提供时避免异常。

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

由于 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 类属性。

string_template_advanced.py

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 属性并定义一个全新的正则表达式。提供的模式必须包含四个命名组,用于捕获转义的分隔符、命名变量、带花括号的变量名以及无效的分隔符模式。

string_template_defaultpattern.py

import string

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

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

\$(?:
  (?P<escaped>\$) |                # 两个分隔符
  (?P<named>[_a-z][_a-z0-9]*)    | # 标识符
  {(?P<braced>[_a-z][_a-z0-9]*)} | # 带花括号的标识符
  (?P<invalid>)                    # 格式错误的分隔符表达式
)

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

string_template_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 和数字字符集相关的常量。

string_constants.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='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'

【声明】内容源于网络
0
0
我爱数据科学
精通R语言及Python,传递数据挖掘及可视化技术,关注机器学习及深度学习算法及实现,分享大模型及LangChain的使用技巧。编著多本R语言、python、深度学习等书籍。
内容 322
粉丝 0
我爱数据科学 精通R语言及Python,传递数据挖掘及可视化技术,关注机器学习及深度学习算法及实现,分享大模型及LangChain的使用技巧。编著多本R语言、python、深度学习等书籍。
总阅读102
粉丝0
内容322