Python学习系列之字符串的常用操作(十八)
字符串的常用操作
1. 字符串的查询操作的方法
举例:
查找变量s='hello,hello' 中 'lo' 的位置
'''字符串的查询操作''' s='hello,hello' print(s.index('lo')) print(s.find('lo')) print(s.rindex('lo')) print(s.rfind('lo')) '''当查询不存在的字符时,index和rindex会报ValueError,find和rfind则返回-1,推荐用find''' #print(s.index('k')) #ValueError: substring not found print(s.find('k')) #-1 #print(s.rindex('k')) #ValueError: substring not found print(s.rfind('k')) #-1
执行结果如下:
说明:字符串索引图如下:
使用index和find是,'lo' 出现的第一个位置是3,使用rindex和rfind查找最后一个'lo'的位置是9,当查找的字符不存在时,使用index和rindex时会报"ValueError",使用find和rfind时则返回-1
2 字符串的大小写转换操作的方法
举例:
- 使用upper()方法将字符串 s='hello,Python' 都转成大写字母
s='hello,Python' # a=s.upper() #转成大写之后,产生一个新的字符串对象 # print(a,id(a)) # print(s,id(s))
执行结果:
说明:在对字符串进行大小写转换操作,会产生一个新的字符串对象,原来的字符串不变
- 使用lower()方法将字符串 s='hello,Python' 都转成小写字母
s='hello,Python' a=s.lower() #转成小写之后,产生一个新的字符串对象 print(a,id(a)) print(s,id(s))
执行结果如下:
- 使用swapcase()方法将字符串 s='hello,Python' 进行大小写互换
s='hello,Python' a=s.swapcase() #转换之后,产生一个新的字符串对象 print(a,id(a)) print(s,id(s))
执行结果:
- 使用capitalize()方法将字符串 s='hello,Python' 把第一个字母转成大写,其它字母转成小写
s='hello,Python' a=s.capitalize() #转换之后,产生一个新的字符串对象 print(a,id(a)) print(s,id(s))
执行结果:
- 使用title()方法将字符串 s='hello,Python' 把每个单词的第一个字母转成大写,其它字母转成小写
s='hello,Python' a=s.title() #转换之后,产生一个新的字符串对象 print(a,id(a)) print(s,id(s))
执行结果:
3 字符串内容对齐操作的方法
举例:
- 使用center()方法将字符串 s='hello,Python' 进行居中对齐操作
#居中对齐 s='hello,Python' print(s.center(20,'*')) #将s居中对齐,其它位置使用*进行填充
执行结果:
- 使用ljust()方法将字符串 s='hello,Python' 进行左对齐操作
#左对齐 s='hello,Python' print(s.ljust(20,'*')) print(s.ljust(10)) print(s.ljust(20))
执行结果:
说明:使用ljust()方法进行左对齐操作时,如果设置宽度10小于原字符串宽度12时,则返回原字符串,如果设置宽度20大于原字符串宽度12时,则右边默认使用空格填充
- 使用rjust()方法将字符串 s='hello,Python' 进行右对齐操作
#右对齐 s='hello,Python' print(s.rjust(20,'0')) print(s.rjust(20)) print(s.rjust(8))
执行结果:
说明:使用rjust()方法进行右对齐操作,当设置宽度20大于原字符串宽度12时,左侧默认使用空格填充,如果设置的宽度8小于原宽度12,则返回原字符串
- 使用zfill()方法将字符串 s='hello,Python' 进行右对齐操作
#右对齐,使用0进行填充 s='hello,Python' print(s.zfill(20)) print(s.zfill(10)) print('-8910'.zfill(8))
执行结果:
说明:使用zfill()方法进行右对齐时,左侧默认使用0填充,当填充的数据前有符号时,则将0填充至符号之后
4 字符串劈分操作的方法
举例:
- 用split()方法对字符串 s='hello world python' 进行劈分,使用默认空格劈分符
'''字符串的劈分(分割)''' s='hello world python' lst=s.split() #当不输入参数时,默认使用空格进行分割,分割后是一个列表 print(lst,type(lst))
执行结果:
说明:s='hello world python'中本身就包含空格,则会默认从空格处进行劈分,会劈分成'hello','world','python'3个字符串组成的列表
- 用split()方法对字符串 s='hello world python' 进行劈分,使用劈分符 '|' 进行劈分,并最多劈分1次
'''使用指定的劈分符进行劈分''' s1='hello|world|python' print(s1.split(sep='|')) #使用'|'进行劈分 print(s1.split(sep='|',maxsplit=1)) #使用'|'进行劈分,最多劈分1次,劈分之后剩余的子字符串会成为一个字符串
执行结果:
说明:使用split()从右侧使用'|'进行劈分时,劈分成3个字符串,当使用参数 maxsplit=1 设置最大劈分次数为1时,剩下的 world|python 会作为一个字符串进行保存
- 用rsplit()方法对字符串 s='hello world python' 进行劈分,使用劈分符 '|' 进行劈分,并最多劈分1次
'''rsplit()从右侧开始劈分''' s1='hello|world|python' print(s1.rsplit(sep='|')) print(s1.rsplit(sep='|',maxsplit=1)) #使用'|'进行劈分,最多劈分1次,劈分之后剩余的子字符串会成为一个字符串
执行结果:
说明:使用rsplit()从右侧使用'|'进行劈分时,和左侧劈分结果一样,都是劈分成3个字符串,当使用参数 maxsplit=1 设置最大劈分次数为1时,剩下的 hello|world 会作为一个字符串进行保存
5 判断字符串操作的方法
举例:
- 判断字符串是否是合法的标识符
'''判断字符串的操作''' #判断字符串是否是合法的标识符 s='hello,python' print('1.',s.isidentifier()) #False print('2.','hello'.isidentifier()) #True print('3.','张三_'.isidentifier()) #True print('4.','张三_123'.isidentifier()) #True
执行结果:
说明:合法标识符是指含有字母、数字和下划线的字符串,s='hello,python' 中包含逗号,则执行结果为False
- 判断字符串是否由空白字符串组成
print('5.','\t'.isspace()) #True
执行结果如下:
- 判断字符串是否全部由字母组成
#判断字符串是否全部由字母组成 print('6.','abc'.isalpha()) #True print('7.','张三'.isalpha()) #True print('8.','abc123'.isalpha()) #False
执行结果:
说明:'abc123' 中包含数字,故输出为False
- 判断字符串全部由十进制数字组成
#判断字符串全部由十进制数字组成 print('9.','123'.isdecimal()) #True print('10.','123四'.isdecimal()) #False print('11','ⅡⅡⅡⅢ'.isalpha()) #False
执行结果:
说明:'四' 不是十进制数字,返回False,'ⅡⅡⅡⅢ'也不是十进制数字,返回False
- 判断字符串是否全部由数字组成
#判断字符串是否全部由数字组成 print('12.','123'.isnumeric()) #True print('13.','123四'.isnumeric()) #True print('14.','ⅡⅡⅡⅢ'.isnumeric()) #True
执行结果:
说明:'四' 是数字,返回True,'ⅡⅡⅡⅢ'也是数字,返回True
- 判断字符串是否全部由字母和数字组成
#判断字符串是否全部由字母和数字组成 print('15.','abc1'.isalnum()) #True print('16.','张三123'.isalnum()) #True print('17.','abc!'.isalnum()) #False
执行结果:
说明:'张三123'是由数字和字母组成,'abc!'不是由数字和字母组成,则返回False
6. 字符串操作的其它方法
举例:
'''字符串的替换''' s='hello,Python' print(s.replace('Python','Java')) s1='hello,Python,Python,Python' print(s1.replace('Python','Java',2))
执行结果:
说明:s1.replace('Python','Java',2) 中2表示最多替换2次,所以最后一个输出中还有一个Python
- 字符串的合并
lst=['hello','java','python'] print('|'.join(lst)) print(''.join(lst)) t=('hello','java','python') print(''.join(t)) print('*'.join('Python'))
执行结果:
说明:'*'.join('Python') 中将Pyhton当成一个序列,如果想用空连接字符串,则用''即可
7.字符串的比较操作
运算符:>, >=, <,<=, ==, !=
比较规则:首先比较两个字符串中的第一个字符,如果相等则继续比较下一个字符,依次比较下去,直到两个字符串中的字符不相等时,其比较结果就是两个字符串的比较结果,两个字符串中的所有后续字符将不再被比较
比较原理:两个字符进行比较时,比较的是其ordinal value(原始值),调用内置函数 ord 可以得到指定字符的ordinal value。与内置函数 ord 对应的是内置函数 chr,调用内置函数 chr 时指定 ordinal value可以得到其对应的字符。
举例:
- 比较 'apple' 和 'app' 两个字符串
'''字符串的比较操作''' print('apple'>'app') #True print('apple'>'banana') #False print(ord('a'),ord('b')) print(chr(97),chr(99))
执行结果:
说明:
apple 和 app 两个字符串比较,第一个字母a 相同,继续比较第二个字符p,第二个字符相同则继续比较第三个字符p,当比较到第4个字符 l 时,app中没有,则停止比较,因 apple 比 app 所包含的字母数多,则 apple 比 app 大,最后输出结果是True
apple 和 banana 比较,根据字符串比较原理,首先比较的是第一个字符a 和 b,a 的原始值是97,b的原始值是98,97 不等于98,所以第一个字母比较结果是False,则不会比较后面的字符,则两者比较输出结果为False,即 apple > banana 不成立。
- == 与 is 的区别
说明:== 比较的是内容,is比较的是内存地址
举例:
'''== 与 is 的区别 ==是比较内容,is是比较内存地址(id) ''' a=b='Python' c='Python' print(a==b) print(b==c) print(a is b) print(a is c) print(id(a)) print(id(b)) print(id(c))
执行结果:
8. 字符串的切片操作
字符串是不可变类型
- 不具备增、删、改等操作
- 切片操作将产生新的对象
完整语法结构:变量名[start:end:step]
示意图:
代码举例:
'''字符串的切片''' s='hello,Python' s1=s[:5] #由于没有指定其实元素,所以从第一个索引开始,截取到索引为5的元素(不包含5) s2=s[6:] #由于没有指定结束为止,所以切到字符串的最后一个元素 s3='!' newstr=s1+s3+s2 print(s1,id(s1)) #hello print(s2,id(s2)) print(s3,id(s3)) print(newstr,id(newstr))
执行结果:
说明:执行结果可以看出,执行切片操作时,都会产生新的对象,因为字符串时不可变类型。
完整语法结构代码示例:
'''完整语法示例 变量名[start:end:step]''' print(s[1:5:1]) #从索引1开始截到索引5(不包含5),步长为1 print(s[::2]) #默认从索引0开始,没有写结束,默认到字符串的最后一个元素,步长为2,两个元素志坚的索引间隔为2 print(s[::-1]) #默认从字符串的最后一个元素开始,到字符串的第一个元素,因为步长为负数 print(s[-6::1]) #从索引为-6开始,到字符串的最后一个元素结束,步长为1
执行结果:
9. 格式化字符串
格式化字符串的三种方式
- 第一种:%作占位符
图解%占位符
代码示例:
'''格式化字符串''' '''使用%作为占位符''' name='张三' age=20 print('我叫%s,今年%d岁' % (name,age))
执行结果:
- 第二种:{}作占位符
图解{}占位符
代码示例:
'''使用{}作为占位符''' name='张三' age=20 print('我叫{0},今年{1}岁'.format(name,age))
执行结果:
- 还可以使用f-string来进行格式化填充
代码示例:
'''使用f-string''' print(f'我叫{name},今年{age}岁')
执行结果:
- 数据精度处理
'''数据精度表示''' print('%d' % 99) print('%10d' % 99) #10表示宽度,除去字符外自动补充空格 print('hellohello') print('%.3f' % 3.1415926) #.3表示是小数位点后三位 #同时表示宽度和精度 print('%10.3f' % 3.1415926) #一共总宽度未10,小数点后3位
执行结果:
用{}来表示精度和宽度
'''用{}表示宽度和精度''' print('{0}'.format(3.1415926)) print('{0:.3}'.format(3.1415926)) #.3表示的是一共是3位数 print('{:.3f}'.format(3.1415926)) #.3f表示是3位小数 print('{:10.3f}'.format(3.1415926)) #同时设置宽度和精度,一共是10位,3位时小数
执行结果:
10.字符串的编码转换
为什么需要字符串的编码转换
编码与解码的方式
- 编码:将字符串转换为二进制数据(bytes),方法是encode()
- 解码:将bytes类型的数据转换成字符串类型,方法是decode()
编码代码示例:
'''字符串的编码和解码''' s='开心的笨小孩' #编码 print(s.encode(encoding='GBK')) #在GBK这种编码格式中,一个中文字符占两个字节 print(s.encode(encoding='UTF-8')) #在UTF-8这种编码格式中,一个中文占3个字节
执行结果:
说明:使用GBK进行编码,一个中文占2个字节,有5个中文,所以共10个编码结果,前面的b标识二进制,在UTF-8编码中一个中文字符占3个字节,所以一共有15个二进制
解码代码示例:
#解码 #byte代表一个二进制数据(字节类型数据) s='开心的笨小孩' byte=s.encode(encoding='GBK') #编码 print(byte.decode(encoding='GBK')) #解码 byte=s.encode(encoding='UTF-8') #编码 print(byte.decode(encoding='UTF-8')) #解码
执行结果:
说明:使用什么样格式进行编码,必须使用同样的格式来解码,否则会报错
----------------------------------------------------------------------------------------------------
字符串知识点总结
1. 字符串的驻留
- 驻留的几种情况
- 驻留的优点
- 强制驻留的方法
2.字符串的常用方法
- 查询方法:index(),rindex(),find(),rfind()
- 大小写转换:upper(),lower()
- 内容对齐:center()
- 字符串的劈分:split()
- 字符串的判断:isdecimal()
- 字符串的替换:replace()
- 字符串的合并:join()
- 字符串的比较:>,>=,<,<=,==,!=
- 格式化字符串:%,format()
- 字符编码:encode(),decode()
--------------------------------------------------------------------------以上为字符串相关内容