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 相关文章推荐
使用Python从有道词典网页获取单词翻译
Jul 03 Python
基于Python代码编辑器的选用(详解)
Sep 13 Python
基于python 爬虫爬到含空格的url的处理方法
May 11 Python
python实现判断一个字符串是否是合法IP地址的示例
Jun 04 Python
python+flask实现API的方法
Nov 21 Python
python调用并链接MATLAB脚本详解
Jul 05 Python
详解Python并发编程之从性能角度来初探并发编程
Aug 23 Python
Pytorch之parameters的使用
Dec 31 Python
python中的垃圾回收(GC)机制
Sep 21 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
Sep 23 Python
python实现学生信息管理系统(精简版)
Nov 27 Python
Python打包exe时各种异常处理方案总结
May 18 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
Yii快速入门经典教程
2015/12/28 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
2016/04/04 PHP
Yii调试查看执行SQL语句的方法
2016/07/15 PHP
php实现URL加密解密的方法
2016/11/17 PHP
TP5.0框架实现无限极回复功能的方法分析
2019/05/04 PHP
Jquery阻止事件冒泡 event.stopPropagation
2011/12/11 Javascript
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
2013/01/15 Javascript
用js来获取上传的文件名纯粹是为了美化而用
2013/10/23 Javascript
jquery索引在使用中的一些困惑
2013/10/24 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
2014/03/20 Javascript
js如何判断用户是否是用微信浏览器
2014/06/05 Javascript
jQuery中Ajax的load方法详解
2015/01/14 Javascript
AngularJS入门教程之多视图切换用法示例
2016/11/02 Javascript
ES6概念 Symbol.keyFor()方法
2016/12/25 Javascript
JavaScript实现二分查找实例代码
2017/02/22 Javascript
关于jQuery.ajax()的jsonp碰上post详解
2017/07/02 jQuery
浅谈node的事件机制
2017/10/09 Javascript
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
2018/11/30 Javascript
vue.js实现双击放大预览功能
2020/06/23 Javascript
Javascript前端下载后台传来的文件流代码实例
2020/08/18 Javascript
[01:02:30]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
利用Fn.py库在Python中进行函数式编程
2015/04/22 Python
Python3使用requests包抓取并保存网页源码的方法
2016/03/15 Python
浅谈五大Python Web框架
2017/03/20 Python
解决seaborn在pycharm中绘图不出图的问题
2018/05/24 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
Python列表的切片实例讲解
2019/08/20 Python
Python django搭建layui提交表单,表格,图标的实例
2019/11/18 Python
Python函数递归调用实现原理实例解析
2020/08/11 Python
python 读取串口数据的示例
2020/11/09 Python
Django基于Models定制Admin后台实现过程解析
2020/11/11 Python
基于 HTML5 WebGL 实现的垃圾分类系统
2019/10/08 HTML / CSS
行政前台岗位职责
2015/04/16 职场文书
干货:企业内部人才推荐奖励方案!
2019/07/09 职场文书
写一个Python脚本下载哔哩哔哩舞蹈区的所有视频
2021/05/31 Python
python基础入门之普通操作与函数(三)
2021/06/13 Python