文章开篇
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_letters | ascii_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,支持复杂表达式和格式化选项。两者各有优势,适用于不同场景。