模板

字符串模板将作为内置的拼接语法的替代用法。使用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库模板的应用的更多相关文章

  1. Lua string库整理

    string库提供了字符串处理的通用函数. 例如字符串查找.子串.模式匹配等. 当在 Lua 中对字符串做索引时,第一个字符从 1 开始计算(而不是 C 里的 0 ). 索引可以是负数,它指从字符串末 ...

  2. lua的string库与强大的模式匹配

    lua原生解释器对字符串的处理能力是十分有限的,强大的字符串操作能力来自于string库.lua的string函数导出在string module中.在lua5.1,同一时候也作为string类型的成 ...

  3. 对python3中pathlib库的Path类的使用详解

    原文连接   https://www.jb51.net/article/148789.htm 1.调用库 ? 1 from pathlib import 2.创建Path对象 ? 1 2 3 4 5 ...

  4. 从C,C++,JAVA和C#看String库的发展(一)----C语言和C++篇

    转自: http://www.cnblogs.com/wenjiang/p/3266305.html 基本上所有主流的编程语言都有String的标准库,因为字符串操作是我们每个程序员几乎每天都要遇到的 ...

  5. Lua的string和string库总结

    Lua有7种数据类型,分别是nil.boolean.number.string.table.function.userdata.这里我总结一下Lua的string类型和string库,复习一下,以便加 ...

  6. Lua 之string库

    标准string库 基础字符串函数 string.len(s) 返回一个字符串的长度,例如 string.rep(s, n) 返回一个新的字符串,该字符串是参数s重复n次得到的结果,例如 )) -- ...

  7. 在lua的string库和正则表达式

    一.前提要了解一下lua 的string几个方法 1. string库中所有的字符索引从前往后是1,2,...;从后往前是-1,-2,... 2. string库中所有的function都不会直接操作 ...

  8. lua string 库

    --lua中字符串索引从前往后是1,2,……,从后往前是-1,-2……. --string库中所有的function都不会直接操作字符串,只返回一个结果. ---------------------- ...

  9. Lua 中的string库(字符串函数库)总结

    (字符串函数库)总结 投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-11-20我要评论 这篇文章主要介绍了Lua中的string库(字符串函数库)总结,本文讲解了string库 ...

随机推荐

  1. linux下 如何切换到root用户

    默认安装完成之后并不知道root用户的密码,那么如何应用root权限呢? (1)sudo 命令 xzm@ubuntu:~$  sudo 这样输入当前管理员用户密码就可以得到超级用户的权限.但默认的情况 ...

  2. BZOJ-1587|前缀和 预处理 dp||叶子合并leaves

    叶子合并leaves Description 在一个美丽的秋天,丽丽每天都经过的花园小巷落满了树叶,她决定把树叶堆成K堆,小巷是笔直的 共有N片树叶(树叶排列也是笔直的),每片树叶都有一个重量值,并且 ...

  3. 目标指定法——S.M.A.R.T.

    一个有效的目标一定要是 具体的(Specific), 可测量的(Measureable), 可实现的(Attainable), 有现实意义的(Realistic), 以及有明确期限的(Time-bas ...

  4. 用JS更好的实现响应式布局

    响应式布局更加高效的方法: 代码实现 <script> $(function() { (function(){ var $html = $('html'); var $window = $ ...

  5. dubbo框架初步学习

    dubbo简介 Dubbo是一个分布式服务框架,以及SOA治理方案.其功能主要包括:高性能NIO通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等. 官网:http://dubb ...

  6. Java中的各种bean对应的意义(VO,PO,BO,QO, DAO,POJO,DTO)

    VO(value object) 值对象 通常用于业务层之间的数据传递,用 new 关键字创建,由 GC 回收的,和 PO 一样也是仅仅包含数据而已.但应是抽象出的业务对象 , 可以和表对应 , 也可 ...

  7. erlang下lists模块sort(排序)方法源码解析(二)

    上接erlang下lists模块sort(排序)方法源码解析(一),到目前为止,list列表已经被分割成N个列表,而且每个列表的元素是有序的(从大到小) 下面我们重点来看看mergel和rmergel ...

  8. 利用scrapy-client 发布爬虫到远程服务端

    远程服务端Scrapyd先要开启 远程服务器必须装有scapyd,并开启. 这里远程服务开启的端口和ip: 192.166.12.80:6800 客户端配置和上传 先修爬虫项目文件scrapy.cfg ...

  9. 将一个JSON数组[{},{},{}]按一定规则合并到另一个JSON数组[{},{},{}]

    // 将一个JSON数组[{},{},{}]按一定规则合并到另一个JSON数组[{},{},{}] // Object.assign方法的第一个参数是目标对象,后面的参数都是源对象. var list ...

  10. nigix反向代理

    参考: https://www.cnblogs.com/yycc/p/8185748.html