Python 利用string.Template完成字符串替换

文章开篇

Python的魅力,犹如星河璀璨,无尽无边;人生苦短、我用Python!


string简介

字符串(string)模块可以追溯到Python的最早版本;
以前在这个模块中实现的许多函数,现在都转移到了内置函数str中
string模块保留了几个用于处理字符串对象的有用常量和类;


内置函数str常用方法

常用方法描述
str.capitalize()将字符串的首字母大写
str.center(width)将原字符串用空格填充成一个长度为width的字符串,原字符串内容居中
str.count(s)返回字符串s在str中出现的次数
str.decode(encoding=’UTF-8’,errors=’strict’)以指定编码格式解码字符串
str.encode(encoding=’UTF-8’,errors=’strict’)以指定编码格式编码字符串
str.endswith(s)判断字符串str是否以字符串s结尾
str.find(s)返回字符串s在字符串str中的位置索引,没有则返回-1
str.index(s)和find()方法一样,但是如果s不存在于str中则会抛出异常
str.isalnum()如果str至少有一个字符并且都是字母或数字则返回True,否则返回False
str.isalpha()如果str至少有一个字符并且都是字母则返回True,否则返回False
str.isdigit()如果str只包含数字则返回 True 否则返回 False
str.islower()如果str存在区分大小写的字符,并且都是小写则返回True 否则返回False
str.isspace()如果str中只包含空格,则返回 True,否则返回 False
str.istitle()如果str是标题化的(单词首字母大写)则返回True,否则返回False
str.isupper()如果str存在区分大小写的字符,并且都是大写则返回True 否则返回False
str.ljust(width)返回一个原字符串左对齐的并使用空格填充至长度width的新字符串
str.lower()转换str中所有大写字符为小写
str.lstrip()去掉str左边的不可见字符
str.partition(s)用s将str切分成三个值
str.replace(a, b)将字符串str中的a替换成b
str.rfind(s)类似于 find()函数,不过是从右边开始查找
str.rindex(s)类似于 index(),不过是从右边开始
str.rjust(width)返回一个原字符串右对齐的并使用空格填充至长度width的新字符串
str.rpartition(s)类似于 partition()函数,不过是从右边开始查找
str.rstrip()去掉str右边的不可见字符
str.split(s)以s为分隔符切片str
str.splitlines()按照行分隔,返回一个包含各行作为元素的列表
str.startswith(s)检查字符串str是否是以s开头,是则返回True,否则返回False
str.strip()等于同时执行rstrip()和lstrip()
str.title()返回”标题化”的str,所有单词都是以大写开始,其余字母均为小写
str.upper()返回str所有字符为大写的字符串
str.zfill(width)返回长度为 width 的字符串,原字符串str右对齐,前面填充0

string模块中的常量

常亮含义
string.ascii_lowercase小写字母abcdefghijklmnopqrstuvwxyz
string.ascii_uppercase大写的字母ABCDEFGHIJKLMNOPQRSTUVWXYZ
string.ascii_lettersascii_lowercase和ascii_uppercase常量的连接串
string.digits数字0到9的字符串0123456789
string.hexdigits字符串0123456789abcdefABCDEF
string.letters字符串abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
string.lowercase小写字母的字符串abcdefghijklmnopqrstuvwxyz
string.octdigits字符串01234567
string.punctuation所有标点字符
string.printable可打印的字符的字符串。包含数字、字母、标点符号和空格
string.uppercase大写字母的字符串ABCDEFGHIJKLMNOPQRSTUVWXYZ
string.whitespace空白字符 \t\n\x0b\x0c\r

string中的模板

在Python中,string 模块的 Template 类提供了一种安全且简洁的方式来处理字符串中的变量替换
它尤其适用于那些需要避免用户输入导致潜在的安全问题(如模板注入攻击)的场合


1.基本使用

from string import Template

# 定义一个模板字符串
desc = "Hello ${name}, ${who} like ${what}, ${what} is amazing."
template_str = Template(desc)

# 使用substitute方法替换模板中的变量
print(template_str.substitute(name="Alice", who='i', what='python'))  # Hello Alice, i like python, python is amazing.

# 缺少需要替换的key值时抛出异常错误:KeyError: 'name'
# print(template_str.substitute(who='i'))


2.字典替换变量

from string import Template

# 定义一个模板字符串
desc = "Hello ${name}, ${who} like ${what}, ${what} is amazing."
template_str = Template(desc)

# 使用字典来替换模板中的变量
data = {'name': 'Bob', 'who': 'I', 'what': "Python"}
# 使用substitute方法替换模板中的变量
print(template_str.substitute(data))  # Hello Bob, I like Python, Python is amazing.

# 使用字典来替换模板中的变量,缺少需要替换的key值时依旧会抛出异常错误
data = {'name': 'Bob'}
# 缺少需要替换的key值时抛出异常错误:KeyError: 'who'
# print(template_str.substitute(data))



3.安全替换

Template 类还提供了一个 safe_substitute 方法,它会在找不到变量时返回原始字符串,而不是引发异常。


from string import Template

# 定义一个模板字符串
desc = "Hello ${name}, ${who} like ${what}, ${what} is amazing."
template_str = Template(desc)

# 使用字典来替换模板中的变量
data = {'name': 'Bob', 'who': 'I', 'what': "Python"}
# 使用substitute方法替换模板中的变量
print(template_str.substitute(data))  # Hello Bob, I like Python, Python is amazing.

# 使用字典来替换模板中的变量
data = {'name': 'Jack', "who": "you"}
# 缺少需要替换的key值时不会抛出异常错误,而是忽略替换
print(template_str.safe_substitute(data))   # Hello Jack, you like ${what}, ${what} is amazing.


4.多重模板
from string import Template

# 定义两个模板字符串
template1 = Template('Hello, $name!')
template2 = Template('Today is $day.')

# 合并两个模板的结果
message = template1.substitute(name='Eve') + ' ' + template2.substitute(day='Thursday')

# 输出结果
print(message)  # 输出: Hello, Eve! Today is Thursday.

format用法

# 大括号匹配,按顺序依次填充
print("My name is {}".format("zhangsan"))   # My name is zhangsan
# 数字匹配,按位置依次填充
print("My {1} is {0}".format("zhangsan","name"))    # My name is zhangsan
# 关键字匹配,按关键字填充
print("My {name} is {tom}".format(tom="zhangsan",name="name"))  # My name is zhangsan


name = 'zhangsan'
like = 'python'
print(f'My name is {name}, I like {like}')  # My name is zhangsan, I like python

进阶用法

format函数不仅可以匹配替换字符串,还可以通过它对齐文本,或者取小数某几位等等。下面,我们来看看这些用法如何实现。


print('{} and {}'.format('tom', 'Jerry'))   # tom and Jerry
# 默认左对齐
print('{:10s}'.format('*'))     # '*         '
# 右对齐
print('{:>10s}'.format('*'))    # '         *'
# 中间对齐
print('{:^10s}'.format('*'))    # '    *     '
# 左对齐
print('{:<10s}'.format('*'))    # '*         '
# # 取2位小数
print('{} is {:.2f}'.format(3.411592653, 3.1415926))    # 3.411592653 is 3.14

values = {"name": "zhangsan", "age": "18",}
strings = "My name is : {name}, I am {age} years old"

print(strings.format(**values)) # My name is : zhangsan, I am 18 years old

高阶用法

format除了能做上面这些事情之外,还可以转换进制以及ASCII码符号等等。下面,我们来实现这些高阶用法。

print('{:b}'.format(8))#:b转换为二进制
print('{:c}'.format(200))#:c转换Unicode字符串
print('{:d}'.format(111))#:d转换十进制
print('{:o}'.format(8))#:o转换八进制
print('{:x}'.format(32))#:x转换十六进制
print('{:e}'.format(32))#:e转换幂符号
print('{:%}'.format(0.32))#:%转换百分值
print('{:n}'.format(32000000000))#:n就是数值
print('{:g}'.format(32000000000))#:n也是数值,不过特别大时转换为幂科学计数

总结

Python的string模块提供了Template和Formatter两个类用于字符串格式化。
Template使用${}语法,适合简单的字符串替换,且能安全处理未提供的变量
Formatter则提供了更灵活的格式化方法,如.format()和f-string,支持复杂表达式和格式化选项。两者各有优势,适用于不同场景。

  • 13
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

需要休息的KK.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值