Python基础06(字符串格式化/操作方法)
字符串
在Python中,字符串属于不可变有序序列,使用单引号、双引号、三单引号或三双引号作为定界符,并且不同的定界符之间可以互相嵌套。
-
除了支持序列通用方法(包括双向索引、比较大小、计算长度、元素访问、切片、成员测试等操作)以外,字符串类型还支持一些特有的操作方法,例如字符串格式化、查找、替换、排版等等。
-
字符串属于不可变序列,不能直接对字符串对象进行元素增加、修改与删除等操作,切片操作也只能访问其中的元素而无法使用切片来修改字符串中的字符。
7.1 转移字符与原始字符串
转义字符 | 含义 | 转义字符 | 含义 |
---|---|---|---|
\b | 退格,把光标移动到前一列位置 | \\ | 一个斜线 |
\f | 换页符 | \' | 单引号 |
\n | 换行符 | \” | 双引号 |
\r | 回车 | \ooo | 3位八进制数对应的字符 |
\t | 水平制表符 | \xhh | 2位十六进制数对应的字符 |
\v | 垂直制表符 | \uhhhh | 4位十六进制数表示的Unicode字符 |
为了避免对字符串中的转义字符进行转义,可以使用原始字符串,在字符串前面加上字母r或R表示原始字符串,其中的所有字符都表示原始的含义而不会进行任何转义。
>>> path = 'C:\Windows\notepad.exe'
>>> print(path) #字符\n被转义为换行符
C:\Windows
otepad.exe
>>> path = r'C:\Windows\notepad.exe' #原始字符串,任何字符都不转义
>>> print(path)
C:\Windows\notepad.exe
7.2 字符串格式化
7.2.1 使用%进行字符串的格式化
- 格式:格式字符串 % 带转换表达式
- 常用的格式字符
格式字符 | 说明 |
---|---|
%s | 字符串 (采用str()的显示) |
%c | 单个字符 |
%d | 十进制整数 |
%i | 十进制整数 |
%o | 八进制整数 |
%x | 十六进制整数 |
%e | 指数 **(****基底写为e) |
%E | 指数 **(****基底写为E) |
%f、%F | 浮点数 |
%g | 指数(e)或浮点数 **(****根据显示长度) |
%G | 指数(E)或浮点数 **(****根据显示长度) |
%% | 一个字符"%" |
#要求被格式化的内容与格式字符之间的数量与顺序都保持一一对应
x = 15
print("%d" %x)
print("%x" %x)
print("%f" %x)
7.2.2 使用format()方法进行字符串格式化
在 Python 中,format()
方法是另一种用于字符串格式化的方式,它比 %
操作符更加灵活和强大。通过 format()
,你可以使用位置参数、关键字参数、甚至更复杂的格式控制。以下是使用 format()
方法进行字符串格式化的示例:
- 基本使用
name = input("请输入你的姓名:")
print("Hello {}!".format(name))
- 使用位置参数
format()
允许你通过位置传递多个参数。在花括号 {}
中使用数字索引来指定参数的顺序。
name = input("请输入你的姓名:")
age = input("请输入你的年龄:")
print("{0}, 今年{1}岁".format(name, age))
- 使用关键字参数
可以使用关键字参数在格式字符串中指定变量名。这样能提高代码的可读性。
print("{name}, 今年{age}岁".format(name="xyx", age=21))
- 混合使用位置和关键字参数
可以同时使用位置参数和关键字参数,位置参数要在关键字参数的前面。
print("{name}, 今年{0}岁".format(22 ,name="xyx"))
- 格式控制(指定宽度、对齐、填充等)
可以使用格式说明符来控制数字或字符串的显示方式。
# 对齐、填充
formatted = "Hello, {:>10}!".format("Alice") # 右对齐,宽度为10
print(formatted)
# 输出: Hello, Alice!
# 数字精度控制
pi = 3.14159
formatted = "Pi is approximately {:.2f}".format(pi) # 保留2位小数
print(formatted)
# 输出: Pi is approximately 3.14
# 使用填充字符
formatted = "Number: {:*^10}".format(123) # 使用 '*' 填充,居中对齐,宽度为10
print(formatted)
# 输出: Number: **123*****
- 使用字典和列表进行格式化
format()
也可以与字典和列表一起使用,通过 **
和 []
来指定。
使用字典:
person = {"name": "Alice", "age": 30}
greeting = "Hello, {name}! You are {age} years old.".format(**person)
print(greeting)
# 输出: Hello, Alice! You are 30 years old.
使用列表:
values = [10, 20, 30]
formatted = "Values are: {0}, {1}, and {2}".format(*values)
print(formatted)
# 输出: Values are: 10, 20, and 30
- 格式化数字(整数和浮点数)
format()
方法也可以帮助你格式化整数和浮点数。你可以指定数字的宽度、填充字符、精度等。
# 整数格式化
number = 42
formatted = "The number is {:05d}".format(number) # 总宽度为5,空缺位置用0填充
print(formatted)
# 输出: The number is 00042
# 浮点数格式化
pi = 3.14159
formatted = "Pi: {:.3f}".format(pi) # 保留3位小数
print(formatted)
# 输出: Pi: 3.142
- 格式化日期
使用 datetime
对象时,format()
也可以帮助格式化日期。
from datetime import datetime
now = datetime.now()
formatted = "Today is: {:%Y-%m-%d}".format(now)
print(formatted)
# 输出: Today is: 2025-01-18 (输出格式依赖于当前日期)
7.2.3 格式化字符串常量
从Python 3.6.x开始支持一种新的字符串格式化方式,官方叫做Formatted String Literals,在字符串前加字母f,含义与字符串对象format()方法类似。
name = input("请输入你的姓名:")
age = input("请输入你的年龄:")
print(f"{name}, 今年{age}岁")
print(f"圆周率为:{math.pi:.2f}")
7.3 字符串常用方法与操作
字符串对象是不可变的,所以字符串对象提供的涉及到字符串“修改”的方法都是返回修改后的新字符串,并不对原始字符串做任何修改,无一例外。
7.3.1 字符串中字符的匹配
find()、rfind()、index()、rindex()、count()
- find()和rfind()方法分别用来查找一个字符串在另一个字符串指定范围(默认是整个字符串)中首次和最后一次出现的位置,如果不存在则返回-1;
- index()和rindex()方法用来返回一个字符串在另一个字符串指定范围中首次和最后一次出现的位置,如果不存在则抛出异常;
- count()方法用来返回一个字符串在当前字符串中出现的次数。
s = "apple,peach,banana,peach,pear"
# 查找字符串中第一次出现 "peach" 的索引。
# "peach" 第一次出现在索引 6 处,因此返回 6。
print(s.find("peach"))
# 查找字符串中第一次出现 "peach" 的索引,在范围 [7, 20) 内。
# 由于 "peach" 第一次出现在索引 6,而我们从索引 7 开始搜索,因此返回 -1,表示没有找到。
print(s.find("peach", 7, 20))
# 查找字符串中最后一次出现 "peach" 的索引。
# "peach" 最后一次出现在索引 13 处,因此返回 13。
print(s.rfind("peach"))
# 查找字符串中第一次出现 "peach" 的索引。
# 类似于 `find()`,但是如果没有找到 "peach",会抛出 `ValueError`。
# "peach" 第一次出现在索引 6 处,因此返回 6。
print(s.index('peach'))
# 查找字符串中第一次出现 "peach" 的索引,在范围 [7, 25) 内。
# 由于 "peach" 没有出现在这个范围内,所以会抛出 `ValueError`。
print(s.index('peach', 7, 25))
# 查找字符串中最后一次出现 "peach" 的索引。
# 类似于 `rfind()`,但是如果没有找到 "peach",会抛出 `ValueError`。
# "peach" 最后一次出现在索引 13 处,因此返回 13。
print(s.rindex('peach'))
# 统计 "peach" 在整个字符串中出现的次数。
# "peach" 出现了 2 次,因此返回 2。
print(s.count('peach'))
# 统计 "peach" 在范围 [7, 20) 内出现的次数。
# 由于 "peach" 在这个范围内没有出现,所以返回 0。
print(s.count('peach', 7, 20))
7.3.2 字符串切割
split()和rsplit()方法分别用来以指定字符为分隔符,把当前字符串从左往右或从右往左分隔成多个字符串,并返回包含分隔结果的列表;
s = "apple,peach,banana,peach,pear"
sList = s.split(",")
print(sList)
对于split()和rsplit()方法,如果不指定分隔符,则字符串中的任何空白符号(空格、换行符、制表符等)都将被认为是分隔符,把连续多个空白字符看作一个分隔符。
s = 'hello world \n\n My name is Dong '
aList = s.split()
print(aList) # ['hello', 'world', 'My', 'name', 'is', 'Dong']
split = s.split("\n")
print(split) # ['hello world ', '', ' My name is Dong ']
split()和rsplit()方法还允许指定最大分割次数
>>> s = '\n\nhello\t\t world \n\n\n My name is Dong '
>>> s.split(None, 1)
['hello', 'world \n\n\n My name is Dong ']
7.3.3 字符串的拼接
字符串的join()方法用来将可迭代对象中的多个字符串进行连接,并在相邻俩个字符串之间插入指定字符串,返回新字符串。
li = ["apple", "peach", "banana", "pear"]
str = ', '.join(li)
print(str)
7.3.4 字符串大小写
>>> s = "What is Your Name?"
>>> s.lower() #返回小写字符串
'what is your name?'
>>> s.upper() #返回大写字符串
'WHAT IS YOUR NAME?'
>>> s.capitalize() #字符串首字符大写
'What is your name?'
>>> s.title() #每个单词的首字母大写
'What Is Your Name?'
>>> s.swapcase() #大小写互换
'wHAT IS yOUR nAME?'
7.3.5 字符串替换
replace(‘被替换字符’, ‘替换字符’)
str = '太原理工大学位于山西太原'
replace = str.replace('太原', '太原迎泽区')
print(replace) #太原迎泽区理工大学位于山西太原迎泽区
maketrans()、translate()
#字符串对象的maketrans()方法用来生成字符映射表,而translate()方法用来根据映射表中定义的对应关系转换字符串并替换其中的字符,使用这两个方法的组合可以同时处理多个字符。
#创建字符映射表
table = ''.maketrans('tyu', 'abc')
s = 'tyut'
translate = s.translate(table)
print(translate)
7.3.6 字符串删除字符
- strip()、rstrip()、lstrip()删除空白字符或指定字符
这三个函数的参数指定的字符串并不作为一个整体对待,而是在原字符串的两侧、右侧、左侧删除参数字符串中包含的所有字符,一层一层地从外往里扒。
>>> s = " abc "
>>> s.strip() #删除空白字符
'abc'
>>> '\n\nhello world \n\n'.strip() #删除空白字符
'hello world'
>>> "aaaassddf".strip("a") #删除指定字符
'ssddf'
>>> "aaaassddf".strip("af")
'ssdd'
>>> "aaaassddfaaa".rstrip("a") #删除字符串右端指定字符
'aaaassddf'
>>> "aaaassddfaaa".lstrip("a") #删除字符串左端指定字符
'ssddfaaa'
7.3.7 判断字符串的开头和结尾
s.startswith(t)、s.endswith(t),判断字符串是否以指定字符串开始或结束
>>> s = 'Beautiful is better than ugly.'
>>> s.startswith('Be') #检测整个字符串
True
>>> s.startswith('Be', 5) #指定检测范围起始位置
False
>>> s.startswith('Be', 0, 5) #指定检测范围起始和结束位置
True
#指定多个判断元素
list = ['a.png', 'b.gif', 'c.exe']
for x in list:
if x.endswith(('.png', '.gif')):# 用元组指定校验字符串
print(f"{x}:符合校验规则")
else:
print(f"{x}:不符合校验规则")
7.3.8 字符串的排版
center()、ljust()、rjust(),返回指定宽度的新字符串,原字符串居中、左对齐或右对齐出现在新字符串中,如果指定宽度大于字符串长度,则使用指定的字符(默认为空格)进行填充。
>>> 'Hello world!'.center(20) #居中对齐,以空格进行填充
' Hello world! '
>>> 'Hello world!'.center(20, '=') #居中对齐,以字符=进行填充
'====Hello world!===='
>>> 'Hello world!'.ljust(20, '=') #左对齐
'Hello world!========'
>>> 'Hello world!'.rjust(20, '=') #右对齐
'========Hello world!'
7.3.9 字符串支持的运算符
# 字符串的拼接
print("Hello " + "world")
# 字符串的重复
print("TYUT " * 3)
# 判断子串
print("ad" in "abcda")
7.3.10 字符串切片
切片也适用于字符串,但仅限于读取其中的元素,不支持字符串修改。
x = 'Explicit is better than implicit.'[:8]
print(x)
path = 'C:\\Python35\\test.bmp'
newPath = path[:-4] + '_new' + path[-4:]
print(newPath)