5.1 字符串的常用操作
微视频
前面章节中已经讲述了创建字符串的方法,本节开始讲解字符串的常用操作。
5.1.1 拼接字符串
使用加号(+)运算符可以将两个字符串连接起来,成为一个新的字符串。例如:
>>>x="昔去景风涉,今来姑洗至。" >>>y="观此得咏歌,长时想精异。" >>>z=x + y >>>print(z) 昔去景风涉,今来姑洗至。观此得咏歌,长时想精异。
☆大牛提醒☆
如果字符串和其他类型的数据拼接,将会报错。例如,将字符串和浮点型数据拼接在一起,将会报错。
>>>s1="我今天购买的苹果价格是" >>>num=8.6 >>>s2="元每千克。" >>>print(s1+num+s2) Traceback (most recent call last): File "<pyshell#7>", line 1, in <module> print(s1+num+s2) TypeError: can only concatenate str (not "float") to str
如果想解决上面的问题,可以使用srt()函数将浮点型数据转换成字符串即可。
>>>print(s1+str(num)+s2) 我今天购买的苹果价格是8.6元每千克。
5.1.2 计算字符串的长度
在计算字符串长度之前,用户需要理解每个字符所占的字节数。在Python语言中,数字、英文、小数点、下画线和空格各占1字节。汉字可能会占2~4字节,占几字节取决于采用的编码。由于Python语言默认采用UTF-8编码,所以汉字占有3字节。
☆大牛提醒☆
汉字在GBK/GB 2312编码中占2字节,在UTF-8/Unicode编码中一般占3字节或4字节。
Python语言通过len()函数计算字符串的长度,语法格式如下:
Len(string)
其中,string是需要计算长度的字符串。例如下面的例子:
>>>s1="我今天需要参加English 考试。" #定义包含英文、中文和中文标点符号的字符串 >>>ls = len(s1) #计算字符串的长度 >>>ls 17
从结果可以看出,len()函数在计算字符串长度时,没有区分英文和中文,统统按一个字符计算。如果用户需要获取字符串实际所占的字节数,就需要指定编码,然后才能获取实际的长度。由于Python语言默认采用UTF-8,可以通过encode()方法进行编码后再进行获取。
例如,对上面的例子进行如下修改:
>>>s1="我今天需要参加English 考试。" #定义包含英文、中文和标点符号的字符串 >>>ls = len(s1.encode()) #计算UTF-8编码的字符串的长度 >>>ls 37
结果输出为37。字符串中有9个汉字和1个中文标点符号,占30字节,英文有7个,占7字节,所以结果为37。
5.1.3 截取字符串
与列表的索引一样,字符串索引从0开始。例如,字符串hello在Python内部被视为h、e、l、l、o 5个字符的组合。因为第1个字符的索引值永远是0,所以存取字符串hello的第1个字符h时使用"hello"[0]。例如:
>>> "hello"[0] 'h' >>> "hello"[2] 'l'
字符串的索引值可以为负值。若索引值为负数,则表示由字符串的结尾向前数。字符串的最后一个字符其索引值是-1,字符串的倒数第二个字符其索引值是-2。例如:
>>>"hello"[-1] 'o' >>>"hello"[-2] 'l'
Python语言程序中访问子字符串变量,可以使用中括号([])和冒号(:)来截取字符串。使用方法如下:
a[x:y]
这里表示截取字符串a,中括号([])内的第1个数字x是要截取字符串的开始索引值,第2个数字y则是要截取字符串的结尾索引值。
☆大牛提醒☆
这里截取的字符串只包含以第1个数字x为索引值的字符,而不包含以第2个数字y为索引值的字符。例如:
>>>s1="我今天需要参加English 考试。" #定义包含英文、中文和中文标点符号的字符串 >>>s1[0:6] #从左边开始截取6个字符 '我今天需要参' >>>s1[:4] #从左边开始截取4个字符 '我今天需' >>>s1[3:6] #截取第4个到第6个字符 '需要参' >>>s1[1:] #截取第2个到最后一个字符 '今天需要参加English 考试。' >>>s1[:] #获取全部的字符 '我今天需要参加English 考试。'
☆大牛提醒☆
截取字符串时,需要注意的问题如下:
如果省略开始索引值,截取字符串就由第一个字符到结尾索引值
如果省略结尾索引值,截取字符串就由开始索引值到最后一个字符。
如果同时省略开始索引值与结尾索引值,截取字符串由第一个字符到最后一个字符。
【例5.1】根据输入的身份证号获取出生日期(源代码\ch05\5.1.py)。
print ("欢迎进入出生日期查询系统\n") num= input("请输入您的身份证号:") #输入身份证号 y = num[6:10] #截取出生年份 m = num[10:12] #截取出生月份 d = num[12:14] #截取出生日期 print ("您的出生日期是:"+y+"年"+m+"月"+d+"日")
程序运行结果如图5-1所示。
图5-1 例5.1的程序运行结果
5.1.4 分割和合并字符串
1.分割字符串
在python语言中,split()方法通过指定分隔符对字符串进行分割(切片)。该方法的语法格式如下:
str.split(str="", num=string.count(str))
其中,参数str用于指定分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等;num为分割的次数。默认值为-1,即分隔所有。该方法将返回分割后的字符串列表。
例如下面的例子。
>>>s2="Experience is the mother of wisdom" >>>print (s2.split( )) #以空格为分隔符 ['Experience', 'is', 'the', 'mother', 'of', 'wisdom'] >>>print (s2.split('i',2)) #以i 为分隔符,分割两次 ['Exper', 'ence ', 's the mother of wisdom'] >>>print (s2.split('m')) #以 m 为分隔符 ['Experience is the ', 'other of wisdo', '']
☆大牛提醒☆
在solit()中,如果不指定参数,则默认采用空格符进行分割。如果出现各个空格或者空白符,都将作为一个分隔符进行分割。
【例5.2】输出被标星的好友(源代码\ch05\5.2.py)。
s1 = "*张三丰*李一真*陶渊明*李白" ls= s1.split( ) #以空格为分隔符 print ("您的标星好友是:") for im in ls: print(im[1:]) #输出每个好友时,去掉*符号
程序运行结果如图5-2所示。
图5-2 例5.2的程序运行结果
2.合并字符串
在Python语言中,join()方法用于将序列中的元素以指定的字符合并(连接)生成一个新的字符串。
join()方法的语法格式如下:
str.join(sequence)
其中,sequence为要合并的元素序列。
例如:
>>>s1 =" " >>>s2 ="*" >>>s3 ="#" #字符串序列 >>>e1=("黄", "沙", "百", "战", "穿", "金", "甲") >>>e2=("不", "破", "楼", "兰", "终", "不", "还") >>> print (s1.join( e1 )) 黄沙 百 战 穿 金 甲 >>> print (s2.join( e2 )) 不*破*楼*兰*终*不*还 >>> print (s3.join( e2 )) 不#破#楼#兰#终#不#还
注意:被合并的元素必须是字符串,如果是其他的数据类型,运行时就会报错。
5.1.5 检索字符串
Python提供了很多检索字符串的方法。下面挑选一些常用的方法进行讲解。
1.count()方法
count()方法用于统计字符串里某个字符出现的次数,可选参数为在字符串搜索的开始与结束位置。
count()方法的语法格式如下:
str.count(sub, start= 0,end=len(string))
其中,sub为搜索的子字符串;start为字符串开始搜索的位置,默认为第一个字符,第一个字符的索引值为0;end为字符串中结束搜索的位置,默认为字符串的最后一个位置。
例如:
>>>str="The best preparation for tomorrow is doing your best today" >>>s='b' >>> print ("字符b 出现的次数为: ", str.count(s)) 字符b 出现的次数为: 2 >>> s='best' >>> print ("best 出现的次数为:", str.count(s,0,6)) best 出现的次数为: 0 >>> print ("best 出现的次数为:", str.count(s,0,40)) best 出现的次数为: 1 >>> print ("best 出现的次数为:", str.count(s,0,80)) best 出现的次数为: 2
2.find()方法
find()方法检测字符串中是否包含子字符串。如果包含子字符串,就返回开始的索引值;否则就返回-1。
find()方法的语法格式如下:
str.find(str, beg=0, end=len(string)
其中,str为指定检索的字符串;beg为开始索引,默认为0;end为结束索引,默认为字符串的长度。例如:
>>> str1 = "青海长云暗雪山,孤城遥望玉门关。" >>> str2 = "玉门" >>> print (str1.find(str2)) 12 >>> print (str1.find(str2,10)) 12 >>> print (str1.find(str2,13,15)) -1
3.index()方法
index()方法检测字符串中是否包含子字符串。如果包含子字符串,就返回开始的索引值,否则就会报一个异常。
index()方法的语法格式如下:
str.index(str, beg=0, end=len(string))
其中,str为指定检索的字符串;beg为开始索引,默认为0;end为结束索引,默认为字符串的长度。例如:
>>>str1 = "青海长云暗雪山,孤城遥望玉门关。" >>>str2 = "玉门" >>> print (str1.index(str2)) 12 >>> print (str1.index (str2,10)) 12 >>> print (str1.index(str2,13,15)) Traceback (most recent call last): File "<pyshell#32>", line 1, in <module> print (str1.index(str2,13,15)) ValueError: substring not found
可见,该方法与find()方法一样,只不过如果str不在string中,就会报一个异常。
5.1.6 字母的大小写转换
low ()方法将字符串中的所有大写字母转换为小写字母。其语法格式如下:
str.lower()
其中,str为指定需要转换的字符串,该方法没有参数。
例如:
>>>s1 ="A GREAT SHIP ASKS FOR DEEP WATERS" >>>print('使用low()方法后的效果:',s1.lower()) 使用low()方法后的效果: a great ship asks for deep waters
从结果可以看出,字符串中的大写字母全部转换为小写字母了。
【例5.3】实现“不区分大小写”功能(源代码\ch05\5.3.py)。
在一个字符串中查找某个子字符串并忽略其大小写,这里需要使用lower()方法。
s1 = "A great Ship asks for deep waters" s2 = "sH" print(s1.find(s2)) #都不转换为小写,找不到匹配的字符串 print(s1.lower().find(s2)) #被查找字符串转换为小写,找不到匹配的字符串 print(s1.lower().find(s2.lower())) #全部转换为小写,找到匹配的字符串
程序运行结果如图5-3所示。
图5-3 例5.3的程序运行结果
结果为-1,表示没有找到对应的字符串;结果为8,表示从字符串的第9个位置找到对应的字符串。可见,字符串中的大写字母全部转换为小写字母后,即可匹配到对应的子字符串。
upper()方法将字符串中的所有小写字母转换为大写字母。
upper()方法的语法格式如下:
str.upper()
其中,str为指定需要转换的字符串,该方法没有参数。
例如:
>>>s2 ="A great ship asks for deep waters" >>>print('使用upper()方法后的效果:',s2.upper()) #全部转换为大写字母输出 使用upper()方法后的效果: A GREAT SHIP ASKS FOR DEEP WATERS
5.1.7 删除字符串中的空格和特殊字符
在处理字符串时,经常需要删除多余的空格和特殊字符。在Python语言中,通过一些内置方法即可轻松处理字符串中的空格和特殊字符。下面将详细讲述这些方法。
1.strip()方法
strip()方法用于删除字符串头尾指定的字符或字符序列。注意:该方法只能删除开头或结尾的字符,不能删除中间部分的字符。
strip()方法的语法格式如下:
str.strip([chars])
参数chars是需要删除的字符序列,默认情况是空格。该方法的返回值为删除指定字符序列后生成的新字符串。
>>>str = "*****茅檐**低小**,溪上青青草。*****" >>>print (str.strip( '*' )) #指定字符串 * 茅檐**低小**,溪上青青草。
从结果可以看出,strip()方法只删除了开头和结尾处的*号,并没有删除中间部分的*号。
>>>str = " 茅檐 低小 ,溪上青青草。 " >>>str.strip() #不指定删除的字符串 '茅檐 低小 ,溪上青青草。'
从结果可以看出,当不指定删除字符时,则默认删除开头和结尾处的空格。
2.lstrip()方法
lstrip()方法用于截掉字符串左边的空格或指定字符。lstrip()方法的语法格式如下:
str.lstrip([chars])
参数chars是需要删除的字符序列,默认情况是空格。该方法的返回值为截掉字符串左边的空格或指定字符后生成的新字符串。
>>>str = "*****茅檐**低小**,溪上青青草。*****" >>>print (str.lstrip( '*' )) #指定字符串 * 茅檐**低小**,溪上青青草。*****
从结果可以看出,lstrip()方法删除了开头处的*号,并没有删除中间和结尾部分的*号。
>>>str = " 茅檐 低小 ,溪上青青草。 " >>>str.lstrip() #不指定删除的字符串 '茅檐 低小 ,溪上青青草。 '
从结果可以看出,当不指定删除字符时,则默认删除开头处的空格。
3.rstrip()方法
rstrip()方法删除字符串末尾的指定字符(默认为空格)。rstrip()方法的语法格式如下:
str.rstrip([chars])
参数chars是需要删除的字符序列,默认情况是空格。该方法的返回值为截掉字符串右边的空格或指定字符后生成的新字符串。
>>>str = "*****茅檐**低小**,溪上青青草。*****" >>>print (str.rstrip( '*' )) #指定字符串 * *****茅檐**低小**,溪上青青草。
从结果可以看出,rstrip()方法删除了结尾处的*号,并没有删除中间和开头部分的*号。
>>>str = " 茅檐 低小 ,溪上青青草。 " >>>str.rstrip() #不指定删除的字符串 ' 茅檐 低小 ,溪上青青草。'
从结果可以看出,当不指定删除字符时,则默认删除结尾处的空格。
5.1.8 使用Python的转义字符
有时候需要在字符串内设置单引号、双引号、换行符等,可使用转义字符。Python的转义字符是由一个反斜杠(\)与一个字符组成,如表5-1所示。
表5-1 Python的转义字符
下面挑选几个常用的转义字符进行讲解。
1.换行字符(\n)
下面的案例是在字符串内使用换行字符:
>>>a="千载长天起大云,中唐俊伟有刘蕡。\n 孤鸿铩羽悲鸣镝,万马齐喑叫一声。" >>>print(a) 千载长天起大云,中唐俊伟有刘蕡。 孤鸿铩羽悲鸣镝,万马齐喑叫一声。
2.双引号(\")
下面的案例是在字符串内使用双引号:
>>>a="高尔基说:\"读的书愈多,就愈亲近世界,愈明了生活的意义,愈觉得生活的重要。\"" >>>print (a) 高尔基说:"读的书愈多,就愈亲近世界,愈明了生活的意义,愈觉得生活的重要。"
3.各进制的ASCII码
下面的案例是显示十六进制数值是55的ASCII码:
>>> a="\x55" >>> a 'U'
下面的案例是显示八进制数值是106的ASCII码:
>>> a= "\106" >>> a 'F'
4.加入反斜杠字符(\\)
如果需要在字符串内加上反斜杠字符,可以在反斜杠符号前多加一个反斜杠符号,例如:下面的案例中字符串包含反斜杠字符。
>>> print ("\\d") \d >>> print (R"\e,\f,\e") \e,\f,\e