当前位置: 首页 > news >正文

Template类创建模板替换字符串

Template类创建模板替换字符串

1.概述

如果你在操作字符串,如果你操作的字符串内容很多,希望字符串中的内容能够根据规则动态替换,并且在长篇幅的字符串中需要替换任意位置任意次数的字符,使用str提供的replace方法代码会写的非常复杂,且出错不易排查。
在这个场景中试试Template类把,他能够创建一个模板替换字符串。

2.Template类介绍

Python中Template是string中的一个类,可以创建一个模板将字符串的格式固定下来,重复利用。使用它来解决需要在一个字符串中替换多处内容将会减轻开发代码的复杂度,使用起来非常简单。

2.1.Template类替换字符串基本操作

1.替换字符串内容

  • Template构造器接收一个待替换的字符串,字符串中${}里面的字符为需要替换的内容。创建一个模板就完成了。
  • substitute方法参数接收替换的内容,替换模板中的字符串。
from string import Template
s1 = "我在用 ${code} ${num} 开发项目"
s = Template(s1)
print(s.substitute(code='Python',num=3))

运行上面的代码,下面输出了替换后的字符串。

我在用 Python 3 开发项目

2.safe_substitute方法替换substitute方法

safe_substitute和substitute方法在用法上都是一样的,但是safe_substitute是安全的可以避免在写代码时候一些疏忽报错。
在开发中建议使用safe_substitute方法,下面通过几个例子介绍下他们的区别。

${}里面的内容和括号有空格会报错

from string import Template
# ${ code }: 括号和code之间有空格
s1 = "我在用 ${ code } ${num} 开发项目"
s = Template(s1)

print(s.safe_substitute(code='Python',num=3))

from string import Template
# ${ code }: 括号和code之间有空格
s1 = "我在用 ${ code } ${num} 开发项目"
s = Template(s1)

print(s.safe_substitute(code='Python',num=3))
print(s.substitute(code='Python',num=3))

运行上面的代码,从结果中可以看出safe_substitute原样输出了变量,没有报错。substitute方法则报错

# safe_substitute输出结果
我在用 ${ code } 3 开发项目

# substitute输出结果
raise ValueError('Invalid placeholder in string: line %d, col %d' %

替换的变量和模板中待替换变量数量不一致则会报错。

from string import Template
# ${ code }: 括号和code之间有空格
s1 = "我在用 ${code} ${num} 开发项目"
s = Template(s1)

# 没有替换num
print(s.safe_substitute(code='Python'))

from string import Template
# ${ code }: 括号和code之间有空格
s1 = "我在用 ${code} ${num} 开发项目"
s = Template(s1)

print(s.substitute(code='Python'))

运行上面的代码,从结果中可以看出safe_substitute原样输出了变量,没有报错。substitute方法则报错

# safe_substitute输出结果
我在用 Python ${num} 开发项目

# substitute输出结果
KeyError: 'num'

2.2.自定义替换字符串符号

如果你不想使用Template类提供的默认$符号作为替换字符的特殊符号,可以自定义一个喜欢的符号,例如下面使用了&符号替换$符号实现替换字符串。

首先创建一个类,继承Template类,重写类的delimiter属性即可修改默认的$符号

from string import Template

# 继承Template类
class MyTemplate(Template):
    # 重写delimiter类属性,它的作用是识别字符串模板中待替换的字符的特殊符号
    delimiter = '&'

def replace():
    s1 = "我在用 &{code} &{num} 开发项目"

    t = MyTemplate(s1)
    rp = t.safe_substitute(code='Python',num=3)
    print(f'使用自定义的替换字符串符号,替换字符串结果:{rp}')

replace()

运行上面的代码,下面显示&符号替换了字符串

使用自定义的替换字符串符号,替换字符串结果:我在用 Python 3 开发项目

2.3.Template运用到项目中

现在开发一个接口测试功能,前端传来的headers中Content-Type属性值是一个待替换的变量。需要将它替换成实际值后在发送接口请求。

下面是一个简化版的替换headers参数,其中headers的值是前端传来的,replace是替换的的目标值,该变量值来自前端传来的变量。

headers = '{"Content-Type": "${appjson}", "token": "mkJihUPm6BTu6lepfmMo"}'
replace = {'appjson': 'application/json'}

s = Template(headers)
replace_header = s.safe_substitute(replace)
print(f'replace headers:{replace_header}')

运行上面的代码,headers中的值替换成功

replace headers:{"Content-Type": "application/json", "token": "mkJihUPm6BTu6lepfmMo"}

相关文章:

  • MySQL日志(undo log 和 redo log 实现事务的原子性/持久性/一致性)
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • 培养出最多亿万富翁的美国大学TOP10榜单
  • 蓝桥杯嵌入式AD采样解析
  • 数据结构和算法——基于Java——4.1栈(数组实现栈、链表实现栈)
  • 怎么看网站域名有没有收录 收录情况怎么样 网站收录查询
  • 信号发生器不会用?一篇文章教会你
  • Java+JSP+MySQL基于SSM的医院挂号就诊系统-计算机毕业设计
  • 今年十八,喜欢ctf-web
  • AI加速(九): 深度理解吞吐量和延时
  • java毕业设计的滑雪场学具租赁管理系统mybatis+源码+调试部署+系统+数据库+lw
  • redis5.0集群搭建(两台服务器)
  • [操作系统笔记]基本分页存储管理
  • 容器运行时与k8s概述
  • [ Linux ] Linux信号概述 信号的产生
  • 「面试题」如何实现一个圣杯布局?
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • C++入门教程(10):for 语句
  • CentOS7 安装JDK
  • Java方法详解
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • React Transition Group -- Transition 组件
  • 程序员最讨厌的9句话,你可有补充?
  • 构建二叉树进行数值数组的去重及优化
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 数组的操作
  • 算法-图和图算法
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • $ git push -u origin master 推送到远程库出错
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (libusb) usb口自动刷新
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十六)一篇文章学会Java的常用API
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ******之网络***——物理***
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET CLR Hosting 简介
  • .NET CORE 第一节 创建基本的 asp.net core
  • .Net core 6.0 升8.0
  • .NET gRPC 和RESTful简单对比
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .net6 webapi log4net完整配置使用流程
  • .net访问oracle数据库性能问题
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)
  • [dfs] 图案计数
  • [DP 训练] Longest Run on a Snowboard, UVa 10285