Python的string模块中的Template类字符串模板用法


Posted in Python onJune 27, 2016

string.Template()
string.Template()内添加替换的字符, 使用"$"符号, 或 在字符串内, 使用"${}"; 调用时使用string.substitute(dict)函数.
可以通过继承"string.Template", 覆盖变量delimiter(定界符)和idpattern(替换格式), 定制不同形式的模板.

代码:

# -*- coding: utf-8 -*- 

import string 
 
template_text = ''''' 
  Delimiter : %% 
  Replaced : %with_underscore 
  Ingored : %notunderscored 
''' 
 
d = {'with_underscore' : 'replaced', 
   'notunderscored' : 'not replaced'} 
 
class MyTemplate(string.Template): 
  delimiter = '%' 
  idpattern = '[a-z]+_[a-z]+' 
   
t = MyTemplate(template_text) 
print('Modified ID pattern: ') 
print(t.safe_substitute(d))

输出:

Modified ID pattern:  
 
  Delimiter : % 
  Replaced : replaced 
  Ingored : %notunderscored

注意: 定界符(delimiter)为"%", 替换模式(idpattern)必须包含下划线, 所以第2个没有进行替换.

正则替换

string.Template的pattern是一个正则表达式, 可以通过覆盖pattern属性, 定义新的正则表达式.
如: 使用新的定界符"{{", 把{{var}}作为变量语法.

代码:

import string 
 
t = string.Template('$var') 
print(t.pattern.pattern) 
 
class MyTemplate(string.Template): 
  delimiter = '{{' 
  pattern = r''''' 
  \{\{(?: 
   (?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 
  ) 
  ''' 
   
t2 = MyTemplate(''''' 
{{{{ 
{{var}} 
''') 
 
print('MATCHES: ', t2.pattern.findall(t2.template)) 
print('SUBSTITUTED: ', t2.safe_substitute(var='replacement'))

输出:

\$(?: 
   (?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 
  ) 
   
MATCHES: [('{{', '', '', ''), ('', 'var', '', '')] 
SUBSTITUTED:  
{{ 
replacement

字符串模板的安全替换(safe_substitute)
字符串模板(sting.Template), 替换时, 使用substitute(), 未能提供模板所需的全部参数值时, 会发生异常.
如果使用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 ValueError as err: 
  print 'Error:', str(err) 
   
print 'safe_substitude() : ', t.safe_substitute(values)

输出:

substitute() : Error: Invalid placeholder in string: line 1, col 18 
safe_substitude() : foo is here but $ missing is not provided!

Python 相关文章推荐
Tornado协程在python2.7如何返回值(实现方法)
Jun 22 Python
django 修改server端口号的方法
May 14 Python
python3爬虫之设计签名小程序
Jun 19 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
Apr 12 Python
Pycharm远程调试原理及具体配置详解
Aug 08 Python
关于Python 常用获取元素 Driver 总结
Nov 24 Python
python3 实现函数写文件路径的正确方法
Nov 27 Python
python读取mysql数据绘制条形图
Mar 25 Python
python使用Thread的setDaemon启动后台线程教程
Apr 25 Python
学python最电脑配置有要求么
Jul 05 Python
运行python提示no module named sklearn的解决方法
Nov 29 Python
Django程序的优化技巧
Apr 29 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
Jun 27 #Python
总结网络IO模型与select模型的Python实例讲解
Jun 27 #Python
结合Python的SimpleHTTPServer源码来解析socket通信
Jun 27 #Python
Python的Tornado框架的异步任务与AsyncHTTPClient
Jun 27 #Python
深入解析Python中的descriptor描述器的作用及用法
Jun 27 #Python
Python中的字符串查找操作方法总结
Jun 27 #Python
解析Python中的__getitem__专有方法
Jun 27 #Python
You might like
PHP随机字符串生成代码(包括大小写字母)
2013/06/24 PHP
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
2014/05/04 PHP
PHP原生函数一定好吗?
2014/12/08 PHP
php使用array_search函数实现数组查找的方法
2015/06/12 PHP
ThinkPHP连接Oracle数据库
2016/04/22 PHP
PHP+Ajax实现的无刷新分页功能详解【附demo源码下载】
2017/07/03 PHP
php ajax数据传输和响应方法
2018/08/21 PHP
Laravel框架中队列和工作(Queues、Jobs)操作实例详解
2020/04/06 PHP
JQUERY CHECKBOX全选,取消全选,反选方法三
2008/08/30 Javascript
jquery中交替点击事件toggle方法的使用示例
2013/12/08 Javascript
document.compatMode的CSS1compat使用介绍
2014/04/03 Javascript
教你如何使用node.js制作代理服务器
2014/11/26 Javascript
AngularJS $injector 依赖注入详解
2016/09/14 Javascript
关于JavaScript和jQuery的类型判断详解
2016/10/08 Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
2016/10/30 Javascript
jquery滚动条插件slimScroll使用方法
2017/02/09 Javascript
jQuery操作cookie的示例代码
2019/06/05 jQuery
优化Vue中date format的性能详解
2020/01/13 Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
2020/03/02 Javascript
JS sort方法基于数组对象属性值排序
2020/07/10 Javascript
[27:02]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第三场
2014/05/24 DOTA
用Python实现一个简单的多线程TCP服务器的教程
2015/05/05 Python
Python多进程写入同一文件的方法
2019/01/14 Python
关于python3中setup.py小概念解析
2019/08/22 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
2019/08/28 Python
Jupyter打开图形界面并画出正弦函数图像实例
2020/04/24 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
2020/06/01 Python
详解CSS3新增的背景属性
2019/12/25 HTML / CSS
介绍一下sql server的安全性
2014/08/10 面试题
教育孩子心得体会
2014/01/01 职场文书
英语专业职业生涯规划范文
2014/03/05 职场文书
2014年人事部工作总结
2014/12/03 职场文书
2014流动人口计划生育工作总结
2014/12/20 职场文书
会议承办单位欢迎词
2019/07/09 职场文书
React中的Context应用场景分析
2021/06/11 Javascript
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS