字符串

一、字符串编码转换

在python中,常用的两种字符串为 str 和 bytes,str表示Unicode字符(ASCII或者其他),bytes表示二进制数据(包括编码的文本)。
两种类型的字符串不能拼接在一起使用。
两者之间可以通过encode()和decode()方法进行转换。

1、1 encode()方法

encode()方法为str对象的方法,用于将字符串转换为二进制数据(bytes),也称“编码”。使用该方法不会修改原字符串。

s.encode([encoding="utf-8"][,errors="strict"])
s: 要进行转换的字符串
encoding="utf-8": 可选参数,用于指定进行转码时采用的字符编码,默认为UTF-8。只有这一参数时可以将“encodeing=”省略。
errors="strict": 可选参数,用于指定错误处理方式,其可选择值可以是①strict(遇到非法字符就抛出异常)、②ignore(忽略非法字符)、
                 ③replace(用"?"代替非法字符)、④xmlcharrefreplace(使用XML的字符引用)等,默认值为strict。
UTF-8: 国际通用的编码,采用一个字节表示英文字符,三个字节表示中文字符。在python3.x中默认采用该编码格式。

1、2 decode()方法
decode()方法为bytes对象的方法,用于将二进制数据转换为字符串,即encode()逆过程,也称"解码"。使用该方法不会修改原字符串。

s.decode([encoding="utf-8"][,errors="strict"])
s: 表示要进行转换的二进制数据,通常是encode()转换的结果。
encoding="utf-8": 可选参数,用于指定进行解码时采用的字符编码,默认为UTF-8。只有这一参数时可以将“encodeing=”省略。
errors="strict": 同上。
s = "表弟别读了"
sbytes = s.encode() #编码,默认为UTF-8
print(sbytes) #输出:b'\xe8\xa1\xa8\xe5\xbc\x9f\xe5\x88\xab\xe8\xaf\xbb\xe4\xba\x86'
#bytes类型的数据是带有b前缀的字符串
print(sbytes.decode()) #解码,输出:表弟别读了

二、字符串常用操作

2、1 拼接字符串
"+"运算符可以连接多个字符串并产生一个字符串对象。
字符串不允许直接与其他类型的数据拼接。

s1 = '表弟一天学习'
num = 24
s2 = '小时'
print(s1 + num + s2)  #不同数据类型,会出现异常
print(s1 + str(num) + s2)  #输出:表弟一天学习24小时

2、2 计算字符串的长度
在python中,数字、英文、小数点、下划线和空格占一个字节;一个汉字可能占2-4个字节(取决于编码形式)。

python中提供了 len() 函数计算字符串的长度。

s = "py爱学习,学习爱py"
print(len(s)) #输出:11

在默认情况下,通过len()计算字符串长度时,不区分英文、数字和汉字,所有字符都认为是一个。

可以通过编码后获取字符串实际字节长度。

s = "py爱学习,学习爱py"
print(len(s.encode())) #计算UTF-8编码的字符串长度
#输出:25

2、3 截取字符串
字符串也属于序列,所以可以采用切片的方法截取字符串。

s[start:end:step]
s: 要截取的字符串
start: 要截取的第一个字符的索引(包括该字符),不指定默认为0
end: 要截取的最后一个字符的索引(不包括该字符),不指定默认为字符串的长度
step: 切片的步长,省略默认为1,省略时最后一个冒号也可以省略。

字符串的索引和序列的索引相同,从0开始,每个字符占一个位置。

s = "表弟爱学习,py666"
s1 = s[::-1] #将字符串倒序
print(s1)  #输出:666yp,习学爱弟表
s2 = s[6:] #从第7个字符开始截取
print(s2)  #输出:py666
s3 = s[:5] #从第1个字符开始截取到第5个字符
print(s3)  #输出:表弟爱学习

2、4 分割、合并字符串

(1)、分割字符串
字符串对象的 split() 方法可以实现字符串的分割。即把一个字符串按照指定的分隔符切分为字符串列表。该列表元素中不包括该分隔符。

s.split(sep,maxsplit)
s: 要分割的字符串
sep: 分隔符,可以包含多个字符,默认为None,即所有空字符(包括空格、换行"\n"、制表"\t"等)。
maxsplit: 可选参数,用于指定分割次数。不指定或者为-1,表示分割次数没有限制。如果没有指定sep参数,也不能指定maxsplit参数。
s = "表 弟 爱   学 习 p y666py"
s1 = s.split() #不指定参数,默认采用空白符进行分割,此时无论有几个空白符都将作为一个分隔符
print(s1) #输出:['表', '弟', '爱', '学', '习', 'p', 'y666py']
s2 = s.split(' ',3)  #以空格为分隔符,分割3次
print(s2) #输出:['表', '弟', '爱', '  学 习 p y666py']
s3 = s.split('6') #如果指定了一个分隔符,那么当这个分隔符出现多个时,就会每个分隔一次,没有得到内容的,将产生一个空元素
print(s3) #输出:['表 弟 爱   学 习 p y', '', '', 'py']

(2)合并字符串
将多个字符串采用固定的分隔符连接在一起。
使用字符串对象的 join() 方法实现

snew = string.join(s)
snew: 合并后生成的新字符串。
string: 字符串类型,用于指定合并时的分隔符。
s: 可迭代对象,该迭代对象中的所有元素(字符串表示)将被合并为一个新的字符串,string作为边界点分割出来。
s = ['表','弟','爱','学','习']
s1 = ''.join(s)
print(s1) #输出:表弟爱学习
s2 = '*'.join(s)
print(s2) #输出:表*弟*爱*学*习

2、5 检索字符串

(1) count() 方法
用于检索指定字符串在另一个字符串中出现的次数。如果检索的字符串不存在,则返回0,否则返回出现的次数。

s.count(sub[,star[,end]])
s: 原字符串
sub: 要检索的子字符串
start: 可选参数,表示检索范围的起始位置的索引(包括该位置),不指定则从头开始
end: 可选参数,表示检索范围的结束位置的索引(不包括该位置),不指定则检索到结尾
s = "01100110"
print(s.count('1')) #输出:4
print(s.count('1',2)) #输出:3
print(s.count('1',2,5)) #输出:1

(2) find() 方法
检索是否包含指定的子字符串。如果检索的子字符串不存在,则返回-1,否则返回首次出现该子字符串时的索引。

s.find(sub[,start[,end]])
s: 原字符串
sub: 要检索的子字符串
start: 可选参数,表示检索范围的起始位置的索引(包括该位置),不指定则从头开始
end: 可选参数,表示检索范围的结束位置的索引(不包括该位置),不指定则检索到结尾
s = "01100110"
print(s.find('11')) #输出:1
print(s.find('11',1)) #输出:1
print(s.find('11',2,6)) #输出:-1
#也可以根据find()方法的返回值是否大于-1来判断子字符串是否存在

python的字符串对象还提供了 rfind() 方法,其作用与 find() 类似,只是从右边开始查找。

(3) index() 方法

index() 方法与 find() 方法类似,也是检索是否包含指定的子字符串。但是当指定的子字符串不存在时会抛出异常。

s.index(sub[,start[,end]])
s: 原字符串
sub: 要检索的子字符串
start: 可选参数,表示检索范围的起始位置的索引(包括该位置),不指定则从头开始
end: 可选参数,表示检索范围的结束位置的索引(不包括该位置),不指定则检索到结尾
s = "01100110"
print(s.index('11')) #输出:1
print(s.index('11',1)) #输出:1
print(s.index('11',2,6)) #异常

python的字符串对象还提供了 rindex() 方法,其作用与 index() 类似,只是从右边开始查找。

(4) startswith() 方法
检索字符串是否以指定子字符串开头,是返回True,不是返回False。

s.startswith(prefix[,start[,end]])
s: 原字符串
prefix: 要检索的子字符串
start: 可选参数,表示检索范围的起始位置的索引(包括该位置),不指定则从头开始
end: 可选参数,表示检索范围的结束位置的索引(不包括该位置),不指定则检索到结尾
s = "01100110"
print(s.startswith('0')) #判断字符串是否以 0 开头

(5) endswith() 方法
检索字符串是否以指定的子字符串结尾,是返回True,不是返回False。

s.endswith(suffix[,start[,end]])
s: 原字符串
suffix: 要检索的子字符串
start: 可选参数,表示检索范围的起始位置的索引(包括该位置),不指定则从头开始
end: 可选参数,表示检索范围的结束位置的索引(不包括该位置),不指定则检索到结尾
s = "01100110"
print(s.endswith('0')) #判断字符是否以 0 结尾

2、6 字母大小写的转换

(1)lower() 方法
将字符串中的全部大写字母转换为小写字母

s = 'aBcD'
print(s.lower()) #输出:abcd
print(s) #输出:aBcD

(2)upper() 方法
将字符串中的全部小写字母转换为大写字母

s = 'aBcD'
print(s.upper()) #输出:ABCD
print(s) #输出:aBcD

2、7 去除字符串左右两边的字符
(1)strip() 方法
去除字符串左右两边的指定字符

s.strip([chars])
s: 要去除字符的原字符
chars: 为可选参数,用于指定要去除的字符,可以指定多个。
       未指定chars参数则默认去除空格、特殊字符(制表符\t、回车符\r、换行符\n等)。
s1 =' \r abcabca  \n\t'
print(s1.strip())  #输出:abcabca
s2 = 'abcabca'
print(s2.strip('a')) #输出:bcabc;中间的字符a不会被去除
s3 = 'abcabca'
print(s3.strip('ba')) #输出:cabc;可以指定多个要删除的字符,与顺序无关

(2)lstrip() 方法
去除字符串左边的指定字符
(3)rstrip() 方法
去除字符串右边的指定字符

2、8 格式化字符串
格式化字符串的意思是先制定一个模板,在这个模板中预留几个空位,然后再根据需要填上相应的内容。空位需要通过指定的符号标记(也称占位符),而这些符号还不会显示出来。

(1)使用%操作符

'%[-][+][0][m][.n]格式化字符'%exp
-: 可选参数,用于指定左对齐。(输出结果)正数前方无符号,负数前方加负号。
+: 可选参数,用于指定右对齐。正数前方加正号,负数前方加负号
0: 可选参数,表示右对齐,正数前方无符号,负数前方加符号,用0填充空白处(一般与m参数一起使用)
m: 可选参数,表示占有宽度
.n: 可选参数,表示小数点后保留的位数
格式化字符: 用于指定类型,如下表
exp: 要转换的项。如果指定多个要用元组形式指定,不能使用列表

格式字符

说明

%s

字符串

%c

单个字符

%d或者%i

十进制整数

%x

十六进制整数

%o

八进制整数

%f或者%F

浮点数

%e(%E)

指数(基底写为e(E))

%%

字符%

print("%.2f"%1.155) #保留小数点后两位,四舍五入
print("%d+%d=%d"%(1,2,3)) #多个指定项用元组形式指定

(2)使用字符串对象的 format() 方法

s.format(args)
s: 指定字符串的显示样式(即模板)
args: 指定要转换的项,如果有多项用逗号隔开

创建模板时使用’{}‘和’:'指定占位符

{[index][:[[fill]align][sign][#][width][.precision][type]]}
index: 可选参数,指定要设置格式的对象在参数列表中的索引位置,索引从0开始,
       如果省略则根据先后顺序进行自动分配(当一个模板中出现多个占位符时,
       指定索引位置的规范需统一,即全部采用手动指定或者自动指定)
fill: 可选参数,指定空白处填充的字符
align: 可选参数,指定对齐方式(值为'<'表示内容左对齐;值为'>'表示内容右对齐;
       值为'='表示内容右对齐,将符号放在填充内容的最左侧,且只对数字类型有效;
       值为'^'表示内容居中),需要配合width一起使用。
sign: 可选参数,用于指定有无符号数(值为'+'表示正数加正号,负数加负号;
      值为'-'表示正数不变,负数加负号;值为空格表示正数加空格,负数加负号)
#: 可选参数,对于二进制、八进制、十六进制,如果加上'#',表示会显示0b/0o/0x前缀,否则不显示前缀
width: 可选参数,用于指定所占宽度
.precision: 可选参数,用于指定保留的小数位数
type: 可选参数,用于指定类型,如下表

格式字符

说明

s

对字符串类型格式化

d

十进制整数

c

将十进制整数自动转换成对应的Unicode字符

e(E)

转换为科学记数法表示再格式化

f(F)

转换为浮点数(默认小数点后保留6位)再格式化

g(G)

自动在e和f或者E和F中切换

b

将十进制整数自动转换成二进制表示再格式化

o

将十进制整数自动转换成八进制表示再格式化

x(F)

将十进制整数自动转换成十六进制表示再格式化

%

显示百分比(默认显示小数点后6位)

print("{}+{}={}".format(1,2,3))  #自动指定
print("{0}+{1}={2}".format(1,2,3))  #手动指定
print("{0}+{0}={1}".format(1,2))
print("{:c}".format(65))
print("{:.2f}".format(1.1))
print("{:#x}".format(11))
print("{:.0%}".format(0.99))