一、模板字符串
模板字符串提供了由 PEP 292 所描述的更简便的字符串替换方式。 模板字符串的一个主要用例是文本国际化 (i18n),因为在此场景下,更简单的语法和功能使得文本翻译过程比使用 Python 的其他内置字符串格式化工具更为方便。 作为基于模板字符串构建以实现 i18n 的库的一个示例,请参看 flufl.i18n 包。
模板字符串支持基于 $ 的替换,使用以下规则:
$$
为转义符号;它会被替换为单个的$
。$identifier
为替换占位符,它会匹配一个名为 “identifier” 的映射键。 在默认情况下,“identifier” 限制为任意 ASCII 字母数字(包括下划线)组成的字符串,不区分大小写,以下划线或 ASCII 字母开头。 在$
字符之后的第一个非标识符字符将表明占位符的终结。${identifier}
等价于$identifier
。 当占位符之后紧跟着有效的但又不是占位符一部分的标识符字符时需要使用,例如"${noun}ification"
。
在字符串的其他位置出现 $
将导致引发 ValueError。
二、Template 类
在python中string 模块提供了实现这些规则的Template类可以将字符串的格式固定下来,重复利用。 Template 有下列方法:
class string.Template(template)
:该构造器接受一个参数作为模板字符串。
-
substitute(mapping={}, /, **kwds)
执行模板替换,返回一个新字符串。 mapping 为任意字典类对象,其中的键将匹配模板中的占位符。 或者你也可以提供一组关键字参数,其中的关键字即对应占位符。 当同时给出 mapping 和 kwds 并且存在重复时,则以 kwds 中的占位符为优先。 -
safe_substitute(mapping={}, /, **kwds)
(1)类似于 substitute(),不同之处是如果有占位符未在 mapping 和 kwds 中找到,不是引发 KeyError 异常,而是将原始占位符不加修改地显示在结果字符串中。 另一个与 substitute() 的差异是任何在其他情况下出现的 $ 将简单地返回 $ 而不是引发 ValueError。
(2)此方法被认为“安全”,因为虽然仍有可能发生其他异常,但它总是尝试返回可用的字符串而不是引发一个异常。 从另一方面来说,safe_substitute() 也可能根本算不上安全,因为它将静默地忽略错误格式的模板,例如包含多余的分隔符、不成对的花括号或不是合法 Python 标识符的占位符等等。
代码示例:
from string import Templates = Template('${who} likes ${what}')
data = {'who': 'Tom','what': 'milky tea'
}
# print(s.substitute(who='Tom', what='cake'))
print(s.substitute(data))# Tom likes cake
# Tom likes milky tea
如果要替换其中一个数据:
print(s.substitute(who='Tom'))Traceback (most recent call last):File "/Users/xxx/PycharmProjects/python-scraping/substitute.py", line 16, in <module>print(s.substitute(who='Tom'))File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/string.py", line 121, in substitutereturn self.pattern.sub(convert, self.template)File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/string.py", line 114, in convertreturn str(mapping[named])
KeyError: 'what'
在这里就需要用到safe_substitute()
方法:
print(s.safe_substitute(who='Tom'))# Tom likes ${what}
官方文档:https://docs.python.org/zh-cn/3.9/library/string.html