1 字符串的声明
字符串使用一对单引号包含,会出现在纯python语言环境中。
字符串通常使用一对双引号包含,因为python会和其他混合开发,使用双引号更为通用。
长字符串:三对引号包含起来的可以换行的字符串, 通常用于多行注释(如文档注释)。
2 字符串切片
2.1 字符串索引
因为字符串是由一系列字符有顺序的排列组成的,所以字符串中的每个字符都在字符串中有自己的索引编号
字符串从左到右,索引从0开始依次
字符串从右往左,索引从-1开始
空格也算作字符
s = "同是天涯沦落人,相逢何必曾相识!"
print(s[6]) # 人
print(s[-3]) # 相
2.2 字符串切片
基本语法:S[开始位置 : 结束位置 : 步长]
字符串切片包含开始位置,不包含结束位置(左闭右开),按照步长进行间隔切片(步长包含自己)
开始索引不写默认开头,结束索引不写默认到尾部步长不写默认为1
步长为负,则倒过来取值
类似的,切片在列表和元组中也可使用,获取相应元素
s = "同是天涯沦落人,相逢何必曾相识!"
print(s[:7]) # 同是天涯沦落人
print(s[4:7]) # 沦落人
print(s[3:10:2]) # 涯落,逢
print(s[-3:-7:-1]) # 相曾必何
# 字符串翻转
print(s[::-1]) # !识相曾必何逢相,人落沦涯天是同
3 字符串常见操作
3.1 字符串变形
str1 = "tong shi TIAN YA lun luo ren"
# upper() 全部大写
print(str1.upper()) # TONG SHI TIAN YA LUN LUO REN
# lower() 全部小写
print(str1.lower()) # tong shi tian ya lun luo ren
# title() 标题首字母大写,字符以非字母划分
print(str1.title()) # Tong Shi Tian Ya Lun Luo Ren
# captialize() 句子首字母大写
print(str1.capitalize()) # Tong shi tian ya lun luo ren
# swapcase() 大小写转换
print(str1.swapcase()) # TONG SHI tian ya LUN LUO REN
3.2 字符串查询
s = "同是天涯沦落人,相逢何必曾相识!"
# index() 返回从左起第一个字符的索引,没有会报错
# rindex() 返回从右起第一个字符串索引(索引依然为正)
print(s.index("人")) # 返回索引 6
print(s.index("行")) # ValueError: substring not found
# find() 返回从左找到第一个字符的索引,没有则返回-1
# rfind() 返回从右起第一个字符串索引(索引依然为正)
print(s.find("天")) # 2
print(s.find("江")) # -1
# startswith() 查看是否以指定字符开头,可以截取判断
print(s.startswith("同")) # True
print(s.startswith("相")) # False
print(s.startswith("天", 2, 5)) # True 从索引2开始查询至索引5
# endswith() 查是否以指定字符结尾,可以截取判断
print(s.endswith("!")) # True
print(s.endswith("识")) # False
print(s.endswith("沦", 2, 5)) # True 从索引2开始查询至索引5
# count() 统计指定字符
print(s.count("相")) # 2
3.3 字符替换
# replace(old, new) 默认全部替换,可指定替换次数
s = "不是天涯沦落人"
print(s.replace("不", "同", 1)) # 同是天涯沦落人 # 1是替换次数
3.4 字符对应关系替换
import string
s = "tianya"
s1 = string.ascii_letters + string.digits
# 由string模块得到字母和数字的拼接 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
s2 = string.digits + string.ascii_letters
# 同理,得到 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY
secret_dict = dict(zip(s1, s2)) # zip函数用于建立对应关系,如"a": 0
secret_table = str.maketrans(secret_dict) # 创建对应关系表
s4 = s.translate(secret_table) # 根据创建的对应关系表替换
print(s4) # j80do0
3.5 字符串拆分和拼接
s = "相逢何必曾相识"
# split() 按照从左起给定的第一个字符对字符串进行拆分,得到拆分后的列表,分割字符不会出现在列表,经常进行批量数据的拆分操作
# rsplit() 从右边开始拆分,功能同上
print(s.split("相")) # ['', '逢何必曾', '识'] 第一个分割前面没有字符,故得到空字符串
print(s.split("何必")) # ['相逢', '曾相识']
# 可指定分割次数,默认为-1,即最大分割
print(s.split("相", maxsplit=1)) # ['', '逢何必曾相识']
# partition() 按照从左起第一个给定的字符,将字符串拆分成三部分组成的元组,经常进行路径文件名称的拆分
# rpartition() 从右边开始,功能同上
print(s.partition("相")) # ('', '相', '逢何必曾相识')
print(s.partition("何必")) # ('相逢', '何必', '曾相识')
# join() 按照指定的字符,将一串有序列的数据进行拼接
# 拼接字符.join(列表)
s1 = ""
lst = ["相逢", "何必", "曾相识"]
print(s1.join(lst)) # 相逢何必曾相识
# rsplitlines() 按照行分隔,返回一个包含各行作为元素的列表,按照换行符分分割
s2 = """同是天涯沦落人,
相逢何必曾相识!"""
print(s2.splitlines()) # ['同是天涯沦落人,', '相逢何必曾相识!']
3.6 字符串的空格处理
# strip() 去掉两边空格,括号内也可指定去除内容
# lstrip() 去掉左边空格,括号内也可指定去除内容
# rstrip() 去掉右边空格,括号内也可指定去除内容
s = " 我从去年辞帝京 "
s2 = "**我从去年辞帝京**"
print(s.strip()) # 我从去年辞帝京 # 两边没空格
print(s2.strip("*")) # 我从去年辞帝京
3.7 字符串对齐操作
s = "我从去年辞帝京,谪居卧病浔阳城。 "
# center() 居中
# ljust() 左对齐
# rjust() 右对齐
# 括号第一个参数是所占字符,第二个参数是填充字符,默认不写为空
print(s.center(30,)) # 我从去年辞帝京,谪居卧病浔阳城。
print(s.center(30, "*")) # ******我从去年辞帝京,谪居卧病浔阳城。 *******
# zfill 字符串填充到指定的长度,不足地方用 0 从左开始补充
print(s.zfill(30)) # 0000000000000我从去年辞帝京,谪居卧病浔阳城。
3.8 字符串判断
s1 = "13"
s2 = "wocongquniancidijing"
s3 = "13xuedepipcheng"
s4 = "xunyang"
s5 = "XUNYANG"
s6 = "XunYang"
# isalnum() 是否只包含字母或数字
print(s1.isalnum()) # True
print(s2.isalnum()) # True
print(s3.isalnum()) # True
# isalpha() 是否只有字母
print(s1.isalpha()) # False
print(s2.isalpha()) # True
print(s3.isalpha()) # False
# isdigit() 是否只有数字
# True: Unicode数字,byte数字(单字节),全角数字(双字节),罗马数字
# False: 汉字数字
print(s1.isdigit()) # True
print(s2.isdigit()) # False
print(s3.isdigit()) # False
# isnumeric() 是否只有数字
# True: Unicode数字,全角数字(双字节)
# False: 罗马数字,汉字数字
# Error: byte数字(单字节)
print(s1.isnumeric()) # True
print(s2.isnumeric()) # False
print(s3.isnumeric()) # False
# isupper() 当中的字母是否大写,其他字符不影响
print(s4.isupper()) # False
print(s5.isupper()) # True
print(s6.isupper()) # False
# islower() 当中的字母是否小写,其他字符不影响
print(s4.islower()) # True
print(s5.islower()) # False
print(s6.islower()) # False
3.9 编码和解码
s = "天涯"
#encode() 编码,将字符串转换成字节码
s_byte = s.encode("utf-8") # b'\xe5\xa4\xa9\xe6\xb6\xaf'
print(s_byte)
#decode() 解码 ,将字节码转换成字符串,和编码格式要对应
print(s_byte.decode("utf-8")) # 天涯
4 字符串格式化展示
4.1 %格式化展示
常见的占位符:
%s:输出一个字符串格式的数据
%d:输出一个整数数据
%f:输出一个浮点数数据
占位符格式:
%ws:w表示输出字符串的宽度,字符串展示右对齐
%-ws:-w表示输出字符串之后左对齐字符串
%5.2f:5表示数据宽度,.2表示保留小数位数
# 字符串 %(元组中要替换的数据)
s1 = "沦落人"
s2 = "相识"
print("同是天涯%s,相逢何必曾%s" % (s1, s2)) # 同是天涯沦落人,相逢何必曾相识
4.2 foemat()格式化展示
# 基本语法:字符串.formart(要替换字符串中占位符的数据)
# 使用位置参数填充
s1 = "沦落人"
s2 = "相识"
print("同是天涯{},相逢何必曾{}。".format(s1, s2)) # 同是天涯沦落人,相逢何必曾相识。
# 使用关键字参数
content = "我的名字叫{name},今年{age}岁。"
print("同是天涯{s1},相逢何必曾{s2}。".format(s1="沦落人", s2="相识")) # 同是天涯沦落人,相逢何必曾相识。
4.3 f""格式化展示
s1 = "沦落人"
s2 = "相识"
print(f"同是天涯{s1},相逢何必曾{s2}。") # 同是天涯沦落人,相逢何必曾相识。
4.4 格式化、精度、精致
4.4.1 %格式
"""
格式化
%s # 不占位输出
%10s # 占10个字符宽度,右对齐
%-10s # 占10个字符宽度,左对齐
%08d # 占8个字符,右对齐,不够8位补0
精度
%.2f # 保留2位小数
%5.2f # 占5个字符,保留两位小数
%05.2f # 占5个字符,保留2位小数,不够前面补0
进制
%o 格式化无符号八进制数
%x 格式化无符号十六进制数
%X 格式化无符号十六进制数(大写)
"""
4.4.42 format()和f""格式
# 需要带冒号
"""
格式化
:[填充字符][对齐方式 <^>][宽度]
< 表示向左对齐, ^表示居中对齐, >表示向右对齐
精度 :wf w 小数位数
进制
:b 二进制
:o 八进制
:x 十六进制
"""
s1 = "同是天涯沦落人"
s2 = 5
print(f"{s1:*<20}") # 同是天涯沦落人*************
print(f"{s2:0>10.2f}") # 0000005.00
print(f"{s2:b}") # 101
5 字符串转义
5.1 转义
使用改变字母意义的符号:\(反斜杠),就称为转义符号
在字符串之前添加字母元字符串( r或者R),则不会进行转义
"""
常用转义:
\n:换行
\r:回车
\a:警铃
\ 续行符,一行代码编写不完,添加该符号后可以换行继续编写
\\ 反斜杠符号
\' 单引号
\" 双引号
\v 纵向制表符
\t 横向制表符
\r 回车(覆盖前面的)
"""
print("同时天涯沦落人,\r相逢何必曾相识\\") # 相逢何必曾相识\
# 元字符串 在任意字符串之前添加字母 r或者R,那么当前字符串中所有转义字符在使用时都不会进行转义操作
print(r"同时天涯沦落人,\r相逢何必曾相识\\") # 同时天涯沦落人,\r相逢何必曾相识\\