Python3的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))
___________________输出____________________________
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()方法可以避免未能向模板提供所需的所有参数值可能产生的异常。
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_subtitute():', t.safe_substitute(values))
___________________输出_________________________________
ERROR :'missing'
safe_subtitute(): %var is here but %missing is not provided
由于字典中没有missing的值,所以substitute()会产生一个KeyError异常。safe_substitute()则不同,他不会抛出这个错误,而是会捕获这个错误并保留文本中的变量表达式。
高级模板:
可以调整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_subtitute(d))
_______________________输出__________________________
Modified ID pattern
Delimiter : %
Replaced : replaced
Ignored : %notunderscored
在上面这个例子中替换规则已经通过正则表达式改变,定界符是%而不是$,而且变量名中间的某个位置必须包含一个下划线。模式%notunderscored不会被替换成任何字符串,因为它不包含下划线符号。
完成更加复杂的修改,可以覆盖pattern属性并定义一个全新的正则表达式。所提供的模式必须包含4个命令组,分别捕获转义定界符、命名变量、加括号的变量名和不合法的定界符模式。
import string
t = string.Template('$var')
print(t.pattern.pattern)
___________________输出_____________________
\$(?:
(?P<escaped>\$) | # Escape sequence of two delimiters
(?P<named>(?a:[_a-z][_a-z0-9]*)) | # delimiter and a Python identifier
{(?P<braced>(?a:[_a-z][_a-z0-9]*))} | # delimiter and a braced identifier
(?P<invalid>) # Other ill-formed delimiter exprs
)
t.pattern为一个已经编译正则表达式,不过可以通过它的pattern属性得到原来的字符串
创建一个新模式的新的模板类型,这里使用{{var}}作为变量语法
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'))
_________________________输出___________________________________
MATCHES: [('{{', '', '', ''), ('', 'var', '', '')]
SUBSTITUTED:
{{
replacement
Python3的string库模板的应用的更多相关文章
- Lua string库整理
string库提供了字符串处理的通用函数. 例如字符串查找.子串.模式匹配等. 当在 Lua 中对字符串做索引时,第一个字符从 1 开始计算(而不是 C 里的 0 ). 索引可以是负数,它指从字符串末 ...
- lua的string库与强大的模式匹配
lua原生解释器对字符串的处理能力是十分有限的,强大的字符串操作能力来自于string库.lua的string函数导出在string module中.在lua5.1,同一时候也作为string类型的成 ...
- 对python3中pathlib库的Path类的使用详解
原文连接 https://www.jb51.net/article/148789.htm 1.调用库 ? 1 from pathlib import 2.创建Path对象 ? 1 2 3 4 5 ...
- 从C,C++,JAVA和C#看String库的发展(一)----C语言和C++篇
转自: http://www.cnblogs.com/wenjiang/p/3266305.html 基本上所有主流的编程语言都有String的标准库,因为字符串操作是我们每个程序员几乎每天都要遇到的 ...
- Lua的string和string库总结
Lua有7种数据类型,分别是nil.boolean.number.string.table.function.userdata.这里我总结一下Lua的string类型和string库,复习一下,以便加 ...
- Lua 之string库
标准string库 基础字符串函数 string.len(s) 返回一个字符串的长度,例如 string.rep(s, n) 返回一个新的字符串,该字符串是参数s重复n次得到的结果,例如 )) -- ...
- 在lua的string库和正则表达式
一.前提要了解一下lua 的string几个方法 1. string库中所有的字符索引从前往后是1,2,...;从后往前是-1,-2,... 2. string库中所有的function都不会直接操作 ...
- lua string 库
--lua中字符串索引从前往后是1,2,……,从后往前是-1,-2……. --string库中所有的function都不会直接操作字符串,只返回一个结果. ---------------------- ...
- Lua 中的string库(字符串函数库)总结
(字符串函数库)总结 投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-11-20我要评论 这篇文章主要介绍了Lua中的string库(字符串函数库)总结,本文讲解了string库 ...
随机推荐
- pam密码策略
PAM 的使用历史 PAM 是关注如何为服务验证用户的 API.在使用 PAM 之前,诸如 login(和 rlogin.telnet.rsh)之类的应用程序在 /etc/passwd 中查找用户名, ...
- C# Winform 中DataGridView 实现单元格输入下拉框功能
https://blog.csdn.net/ad13adsa/article/details/82108969 private void dataGridViewX1_EditingControlSh ...
- Latex 仅使用 hyperref 包中 \href 的方法
参考: How to ask hyperref works only with href Latex 仅使用 hyperref 包中 \href 的方法 在 .tex 文件的开头使用如下方法引用 hy ...
- 将webcam设置为网站favicon
今天在Twitter上看到用户davywtf将webcam设置为网站favicon. 在线示例: https://wybiral.github.io/code-art/projects/tiny-mi ...
- 【搬运工】linux下创建用户(一)
转载:http://www.cnblogs.com/ylan2009/articles/2321177.html linux下创建用户(一) Linux 系统是一个多用户多任务的分时操作系统,任何一个 ...
- JS及相关控件
1.radio 1)不选中任何值 2)获取选中的值 3)让某个选项选中 4)发生改变时的事件 5)让某个选项不能选 2.CheckBox 1)选中 2)取消 3.select 1)获取下拉框选中项的显 ...
- python yaml用法详解
YAML是一种直观的能够被电脑识别的的数据序列化格式,容易被人类阅读,并且容易和脚本语言交互.YAML类似于XML,但是语法比XML简单得多,对于转化成数组或可以hash的数据时是很简单有效的. Py ...
- spring xml配置注入改为手动注入过程
项目中需要使用MQ组件来接受消息,但是有的时候,在使用的时候,并不能满足spring注入的条件,无法注入.例如 在jfinal的config的afterJFinalStart中,由于jfinal集成s ...
- Ctrl+Alt+Down/Up 按键冲突
I mapped Ctrl-Alt-Up/Down to open web-browser and email client but it didn't take effect. Ctrl-Alt-U ...
- Dynamic CRM插件调试与单元测试
背景 使用Dynamic CRM平台开发完业务插件后,不可避免的就是进行插件调试,测试插件是否正常运行,网上关于Dynamic CRM的资料比较少,但对于调试的博客还是挺多的,足可见插件调试对于Dyn ...