1、第四章 字符串 我们前面已经接触过字符串,也了解了一些基本操作,对字符串的创建、索引和分片等操作已经有了初步的理解。本章将介绍字符串的格式化、分割、搜索等方法。Python快乐学习班的同学乘坐“序列号”大巴来到了今天的第一个景点字符串主题游乐园。在这里他们将看到字符串魔幻般的变化,以及字符串的各种好玩的技巧。下面就让我们和Python快乐学习班的全体同学开始进入字符串主题游乐园进行“观赏”学习。4.1 字符串的简单操作 字符串是 Python 中最常用的数据类型。我们可以使用引号(或)来创建字符串。创建字符串很简单,只要为变量分配一个值即可。请看下面的例子:say=just do it#创建字
2、符串just do it,并赋给变量say 在Python中,标准序列的所有操作(如索引、分片、成员资格、求长度、取最小值和最大值等)对字符串都适用,在第三章中,这些操作的使用示例就是直接用字符串做演示的。不过字符串是不可变的,所以字符串做不了分片赋值。看如下操作:say=just do it say just do it say-2:it say-2:=now Traceback(most recent call last):File,line 1,in say-2:=now TypeError:str object does not support item assignment 怎么在一
3、个打印语句中打印出两行?看如下输入:print(读万卷书,n行万里路。)读万卷书,行万里路。输出结果得到了两行,这里使用了转义字符n,它表示换行的意思。Python中有很多转义符:转义字符转义字符描述描述转义字符转义字符描述描述(在行尾时在行尾时)续行符n换行反斜杠符号v纵向制表符单引号t横向制表符双引号r回车a响铃f换页b退格(Backspace)oyy八进制数,yy代表的字符,例如:o12代表换行e转义xyy十六进制数,yy代表的字符,例如:x0a代表换行000空空other其它其它的字符以普通格式输出的字符以普通格式输出4.2 字符串格式化 我们目前为止对字符串的操作都是停留在赋值、重新
4、赋值、索引、分片和打印等一些比较基本的操作上,其实字符串还有更多更好的操作方式,例如在实际的项目开发中,经常使用的字符串格式化的操作也比较常见。4.2.1 经典的字符串格式化符号百分号(%)字符串格式化使用字符串格式化操作符百分号%来实现。(注意:%也可以用作模运(求余)输操作符。)。输入如下:print(hi,%s%python)hi,python print(一年有%s个月%12)一年有12个月 在%的左边放置一个待格式化的字符串,右边则放置希望格式化的值。格式化的值可以是一个字符串或者数字。格式化字符串的%s部分称为转换说明符,它标记了需要放置转换值的位置,更通用的术语称为占位符。这个可
5、以想象成在学校上自习时,我们通常会放一个物品在一个位置上,其他人一看有这个位置放东西了,就知道这个位置被占了,而对于我们,不论什么时候去自习,直接到自己占好的位置上坐下即可。这里就可以把%s当作我们使用的物品,我们则相当于后面的%右边的值。上面示例中s表示百分号右边的值会被格式化为字符串,s指的是str,如果不是字符串,会使用str将其转换为字符串。如示例中就将10转换为字符串了。用这种方式对大多数值都有效。Python为我们提供了如下所示的格式化符号:符号符号描述描述符号符号描述描述%c 格式化字符及其ASCII码%f 格式化浮点数字,可指定小数点后的精度%s 格式化字符串%e 用科学计数法
6、格式化浮点数%d 格式化整数%E 作用同%e,用科学计数法格式化浮点数%u 格式化无符号整型%g%f和%e的简写%o 格式化无符号八进制数%G%f 和%E 的简写%x 格式化无符号十六进制数%p 用十六进制数格式化变量的地址%X格式化无符号十六进制数(大写)格式化无符号十六进制数(大写)4.2.2 元组的字符串格式化 格式化操作符的右操作数可以是任何东西,如果是元组或者映射类型(如字典,下一章将进行讲解),那么字符串格式化将会有所不同。我们尚未涉及映射(字典),这里先了解一下元组。如果右操作数是元组,则其中的每一个元素都会被单独格式化,每个值都需要一个对应的转换说明符。输入如下:print(%
7、s年的冬奥会将在%s举行,预测中国至少赢取%d枚金牌%(2022,北京,5)2022年的冬奥会将在北京举行,预测中国至少赢取5枚金牌 基本的转换说明符包括以下部分。注意,这些项的顺序是至关重要的。(1)%字符:标记转换说明符的开始。(2)转换标志(可选):-表示做对齐;+表示在转换值之前要加上正负号;“”(空白字符)表示正数之前保留空格;0表示转换值若位数不够则用0填充。(3)最小字段宽度(可选):转换后的字符串至少应该具有该值指定的宽度。如果是*,则宽度会从值元组中读出。(4)点(.)后跟精度值(可选):如果转换的是实数,精度值表示出现在小数点后的位数。如果转换的是字符串,那么该数字就表示最
8、大字段宽度。如果是*,那么精度将会从元组中读出。(5)转换类型:参见格式化表。4.2.3 format4.2.3 format字符串格式化字符串格式化 从Python 2.6开始,引入了另外一种字符串格式化的方式,形式为str.format()。str.format()是对百分号(%)格式化的改进。使用str.format()时,替换字段部分使用花括号表示。在交互模式下输入:hello,.format(world)hello,world print(圆周率PI的值为:0.format(3.141593)圆周率PI的值为:3.141593 print(圆周率PI的值为:0:.2f.format(
9、3.141593)圆周率PI的值为:3.14 print(圆周率PI的值为:pi.format(pi=3.141593)圆周率PI的值为:3.141593 print(年的冬奥会将在举行,预测中国至少赢取枚金牌.format(2022,北京,5)2022年的冬奥会将在北京举行,预测中国至少赢取5枚金牌 print(0年的冬奥会将在1举行,预测中国至少赢取2枚金牌.format(2022,北京,5)2022年的冬奥会将在北京举行,预测中国至少赢取5枚金牌 print(0年的冬奥会将在2举行,预测中国至少赢取1枚金牌.format(2022,5,北京)2022年的冬奥会将在北京举行,预测中国至少赢
10、取5枚金牌 print(year年的冬奥会将在address举行.format(year=2022,address=北京)2022年的冬奥会将在北京举行 str.format()的使用形式为:用一个点号连接字符串和格式化值,多于一个的格式化值需要用元组表示。字符串中,带格式化的占位符用花括号()表示。花括号中可以没有任何内容,没有任何内容时,若有多个占位符,则元组中元素的个数需要和占位符的个数一致。花括号中可以使用数字,数字指的是元组中元素的索引下标,字符串中花括号中的索引下标不能超过元组中最大的索引下标,元组中的元素值可以不全部使用。花括号中可以使用变量名,在元组中对变量名赋值。花括号中的所
11、有变量名,在元组中必须要有对应的变量定义并被赋值。元组中定义的变量可以不出现在字符串的花括号中。如下所示:print(year年的冬奥会将在address举行.format(year=2022,address=北京,num=5)2022年的冬奥会将在北京举行4.2.4 字符串格式化的新方法 从Python3.6开始,引入了一种新的字符串格式化字符:_f-strings_,格式化字符串。使用f字符串做格式化可以节省很多的时间,使格式化更容易。f字符串格式化也称为“格式化字符串文字”,因为f字符串格式化是开头有一个f的字符串文字,即使用f格式化字符串时,需在字符串前加一个f前缀。f字符串格式化包含
12、了由花括号括起来的替换字段,替换字段是表达式,它们会在运行时计算,然后使用format()协议进行格式化。_f-strings_使用方式如下:fhello,world hello,world f2*10 20 year=2022 address=北京 gold=5 print(fyear年的冬奥会将在address举行,预测中国至少赢取gold枚金牌)2022年的冬奥会将在北京举行,预测中国至少赢取5枚金牌 在Python中,使用百分号(%)、str.format()形式可以格式化的字符串,都可以使用f字符串格式化实现。4.3 字符串方法 前面一章介绍了很多列表的方法,字符串的方法比列表的还要
13、多,是因为字符串从string模块中“继承”了很多方法。因为字符串的方法比较多,这里只介绍一些特别有用的方法,全部方法见附录A。4.3.1 split split()方法通过指定分隔符对字符串进行切片。split()方法的语法:str.split(st=,num=string.count(str)str代表的是指定检索的字符串,st代表分隔符,默认为空格,num代表分割次数。返回分割后的字符串列表。如果参数num 有指定值,则仅分隔 num 个子字符串。这是一个非常重要的字符串方法,它是join的逆方法,用来将字符串分割成序列。示例如下:say=stay hungry stay foolish
14、 print(不提供任何分割符分割后的字符串:,say.split()不提供任何分割符分割后的字符串:stay,hungry,stay,foolish print(根据字母t分割后的字符串:,say.split(t)根据字母t分割后的字符串:s,ay hungry s,ay foolish print(根据字母s分割后的字符串:,say.split(s)根据字母s分割后的字符串:,tay hungry,tay fooli,h print(根据字母s分割2次后的字符串:,say.split(s,2)根据字母s分割2次后的字符串:,tay hungry,tay foolish 在实际项目应用中,s
15、plit()方法应用的频率比较高,特别在文本处理或字符串处理的业务中,经常需要使用该方法做一些字符串的分割操作,以得到某个值。4.3.2 strip strip()方法用于移除字符串头尾指定的字符(默认为空格)。strip()方法的语法:str.strip(chars)此语法中str代表的是指定检索的字符串,chars代表移除字符串头尾指定的字符。返回移除字符串头尾指定的字符生成的新字符串。该方法使用示例如下:say=stay hungry stay foolish#字符串前后都带有空格 print(f原字符串:say,字符串长度为:len(say)原字符串:stay hungry stay
16、foolish,字符串长度为:26 print(f新字符串:say.strip(),新字符串长度为:len(say.strip()新字符串:stay hungry stay foolish,新字符串长度为:24 say=-stay hungry stay foolish-print(f原字符串:say,字符串长度为:len(say)原字符串:-stay hungry stay foolish-,字符串长度为:28 print(f新字符串:say.strip(-),新字符串长度为:len(say.strip(-)新字符串:stay hungry stay foolish,新字符串长度为:24 s
17、ay=-stay-hungry-stay-foolish-print(f原字符串:say,字符串长度为:len(say)原字符串:-stay-hungry-stay-foolish-,字符串长度为:28 print(f新字符串:say.strip(-),新字符串长度为:len(say.strip(-)新字符串:stay-hungry-stay-foolish,新字符串长度为:24 在实际项目应用中,strip()方法使用得比较多,特别在对字符串进行合法性校验时,一般都会先做一个移除首尾空格的操作。当字符串不确定在首尾是否有空格时,一般也会先用strip()方法操作一遍。4.3.3 join j
18、oin()方法用于将序列中的元素以指定的字符连接生成一个新的字符串。join()方法的语法:str.join(sequence)此语法中str代表的是指定检索的字符串,sequence代表要连接的元素序列。返回通过指定字符连接序列中元素后生成的新字符串。示例如下:say=(stay hungry,stay foolish)new_say=,.join(say)print(f连接后的字符串列表:new_say)连接后的字符串列表:stay hungry,stay foolish path_str=d:,python,study path=/.join(path_str)print(fpython
19、 file path:path)python file path:d:/python/study num=1,2,3,4 mark=+mark.join(num)Traceback(most recent call last):File,line 1,in mark.join(num)TypeError:sequence item 0:expected str instance,int found join()方法只能对字符串元素进行连接,用join()方法进行操作时,调用和被调用的对象必须都是字符串,任意一方不是字符串,最终操作结果都会报错。在实际项目应用中,join()方法应用得也比较多,
20、特别是在做字符串的连接时,使用join()方法的效率比较高,占用的内存空间也小。在路径拼接时,使用join()是个不错的选择。4.3.4 find find()方法检测字符串中是否包含子字符串str。find()方法的语法:str.find(str,beg=0,end=len(string)此语法中str代表的是指定检索的字符串,beg代表开始索引,默认为0,end代表结束索引,默认为字符串的长度。它返回子串所在位置的最左端索引,如果没有找到则返回-1。示例如下:say=stay hungry,stay foolish print(fsay字符串的长度是:len(say)say字符串的长度是:
21、24 say.find(stay)0 say.find(hun)5 say.find(sh)22 find()方法还可以接收起始索引下标参数和结束索引下标参数,用于表示字符串查找的起始点和结束点,例如:say=stay hungry,stay foolish say.find(stay,3)#提供起点 12 say.find(y,3)#提供起点 3 say.find(hun,3)#提供起点 5 say.find(stay,3,10)#提供起点和终点-1 say.find(stay,3,15)#提供起点和终点-1 say.find(stay,3,18)#提供起点和终点 12 在实际项目应用中,f
22、ind()方法的使用不是很多,一般在想要知道某个字符串在另一个字符串中的索引下标位置时使用较多,其余情形比较少使用。4.3.5 lower lower()方法转换字符串中所有大写字符为小写。lower()方法语法:str.lower()str代表的是指定检索的字符串,该方法不需要参数。返回将字符串中所有大写字符转换为小写后生成的字符串。示例如下:field=DO IT NOW print(调用lower得到字符串:,field.lower()调用lower得到字符串:do it now greeting=Hello,World print(调用lower得到字符串:,greeting.lowe
23、r()调用lower得到字符串:hello,world 要在一个字符串中查找某个子字符串并忽略大小写,也可以使用lower()方法,操作如下:field=DO IT NOW field.find(It)#field字符串不转换为小写字母,找不到匹配字符串-1 field.lower().find(It)#field字符串先转换为小写字母,但It不转为小写字母,找不到匹配字符串-1 field.lower().find(It.lower()#都使用lower()方法转换成小写字母后查找 3 在实际项目应用中,lower()方法的应用也不是很多,lower()方法的主要应用场景是将字符串中的大写字
24、母转换为小写字母,或是在不区分字母大小写时比较字符串,其他场景应用相对少。4.3.6 upper upper()方法将字符串中的小写字母转为大写字母。upper()方法语法:str.upper()此语法中str代表的是指定检索的字符串,该方法不需要参数。返回小写字母转为大写字母的字符串。示例如下:field=do it now print(调用upper得到字符串:,field.upper()调用upper得到字符串:DO IT NOW greeting=Hello,World print(调用upper得到字符串:,greeting.upper()调用upper得到字符串:HELLO,WOR
25、LD 要在一个字符串中查找某个子字符串并忽略大小写,也可以使用upper()方法,操作如下:field=do it now field.find(It)#都不转换为大写,找不到匹配字符串-1 field.upper().find(It)#被查找的字符串不转换为大写,找不到匹配字符串-1 field.upper().find(It.upper()#使用upper()方法转换为大写后查找 3 在实际项目应用中,upper()方法的应用也不是很多,upper()方法的主要应用场景是将字符串中的小写字母都转换为大写字母,或是在不区分字母大小写时比较字符串,其他场景应用相对少。4.3.7 replace
26、 replace()方法用于做字符串替换。replace()方法的语法:str.replace(old,new,max)此语法中,str代表指定检索的字符串;old代表将被替换的子字符串;new代表新字符串,用于替换old子字符串;max代表可选字符串,如果指定了max参数,则替换次数不超过max次。返回结果为将字符串中的old(旧字符串)替换成new(新字符串)后生成的新字符串。示例如下:field=do it now,do right now print(原字符串:,field)原字符串:do it now,do right now print(新字符串:,field.replace(do
27、,Just do)新字符串:Just do it now,Just do right now print(新字符串:,field.replace(o,Just,1)新字符串:dJust it now,do right now print(新字符串:,field.replace(o,Just,2)新字符串:dJust it nJustw,do right now print(新字符串:,field.replace(o,Just,3)新字符串:dJust it nJustw,dJust right now 使用replace()方法时,若不指定第3个参数,则字符串中所有匹配到的字符都会被替换;若指
28、定第3个参数,则从字符串的左边开始往右进行查找匹配并替换,达到指定的替换次数后,便不再继续查找,若字符串查找结束仍没有达到指定的替换次数,则结束。在实际项目应用中,replace()方法的应用不多,遇到需要使用稍微复杂的替换时,可以查阅相关文档。4.3.8 swapcase swapcase()方法的语法:str.swapcase()str代表的是指定检索的字符串,该方法不需要参数。返回大小写字母转换后生成的新字符串。swapcase()方法用于对字符串的大小写字母进行转换,将字符串中大写转换为小写,小写转换为大写。示例如下:field=Just do it,NOW print(原字符串:,f
29、ield)原字符串:Just do it,NOW print(调用swapcase方法后得到的字符串:,field.swapcase()调用swapcase方法后得到的字符串:jUST DO IT,now 在实际项目应用中,swapcase()方法应用得比较少。4.3.9 translate translate()方法的语法:str.translate(table,deletechars)此语法中str代表的是指定检索的字符串,table代表翻译表,翻译表是通过maketrans方法转换而来,deletechars代表字符串中要过滤的字符列表。返回翻译后的字符串。translate()方法根据
30、参数table给出的表(包含256个字符)转换字符串的字符,要过滤掉的字符放到del参数中。示例如下:intab=adefs outtab=12345 trantab=str.maketrans(intab,outtab)st=just do it print(st调用translate方法后:,st.translate(trantab)st调用translate方法后:ju5t 2o it translate()方法和replace()方法一样,可以替换字符串中的某些部分。但和replace()方法不同的是,translate()方法只处理单个字符,而translate()方法的可以同时进行
31、多个替换,有时比replace()方法的效率高很多。在实际项目应用中,translate()方法的使用属于比较高级的应用,学有余力的读者可以多做一些深入了解。4.4 活学活用知识拓展 前面介绍了一些字符串的方法,本节将字符串的另外两个方法作为拓展进行介绍,此外,本节也将提前使用第六章的一些知识点。1.enumerate()方法方法 2.zip()方法方法 具体使用参考书本讲解。具体使用参考书本讲解。4.5 技巧点拨(1)尝试使用整数格式化的占位符格式化字符串。(2)在使用%f输出圆周率的示例中,若将%f更改为%d,是否能正常输出?若能正常输出,输出结果会怎样?(3)在用0填充的示例中,把010的第一个0更改为其他数字,看看输出结果。再在精度之前添加一个0或大于0、小于0的数字,看看输出结果。4.6 问题探讨(1)字符串格式化在项目实战中一般用于做什么?(2)字符串方法很常用吗?4.7 章节回顾(1)回顾字符串的基本操作都有哪些。(2)回顾有哪些字符串格式化的方法。(3)回顾字符串有哪些方法,都怎么使用。4.8 4.8 实战演练实战演练