字符串处理
9
9.1 简介
在前面的章节里我们介绍了常用的数据类型,其中字符串并没有单独拎出来讲,那么接下来我们将重点讲下它。字符串一般是通过引号('或")包裹起来的,因为它有丰富的函数而且经常使用,所以我要 详细认识下。
字符串的基本操作这里不再细述,详见基础概念里的字符串部分。这里讲些字符串里的处理方法。
9.2 转义符
字符串里有些特殊字符,需要转义才能还原其本来的意义。如下表列举了常见的转义符:
转义字符 | 含义 | 备注 |
\(在行尾时) | 续行符 | \ ... print('hello') 执行结果: hello |
\\ | 反斜杠符号 | print('\\') 执行结果: \ |
\' | 单引号 | print('his\'name is Tom!') 执行结果: his'name is Tom! |
\" | 双引号 | print("his\"name is Tom!") 执行结果: his"name is Tom! |
\a | 响铃 | print('\a') 执行结果: 一个滴的声音。 |
\b | 退格(Backspace) | print('这是个退格键\b退格') 执行结果: 这是个退格退格 |
\e | 转义 | import re re.findall('\w','abcdefghijklmnopqrstuvwxyz') 执行结果: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] |
\000 | 空 | print(ascii("\000")) '\x00' print("\000") 执行结果:
注:这里输出个空。
|
\n | 换行 | print("这是个\n空行") 执行结果: 这是个 空行 |
\v | 纵向制表符 |
|
\t | 横向制表符 | print("这是个\t制表符") 这是个 制表符 |
\r | 回车 | f = open("G:\\test.txt", "w") num = f.write( " Python 是一个非常好的语言。\r趣味编程是个优质的团队" ) # 关闭打开的文件 f.close() f = open("G:\\test.txt", "r") print(f.read()) f.close() 执行结果: Python 是一个非常好的语言。 趣味编程是个优质的团队 |
\f | 换页 |
|
\oyy | 八进制数,yy代表的字符 | f = open("G:\\test.txt", "w") num = f.write( " Python 是一个非常好的语言。\f趣味编程是个优质的\o12团队" ) print(num) # 关闭打开的文件 f.close() f = open("G:\\test.txt", "r") print(f.read()) f.close() 执行结果: Python 是一个非常好的语言。趣味编程是个优质的 团队 注:\x0a是时间制的10,所以是换行。 |
\xyy | 十六进制数,yy代表的字符,例如:\x0a代表换行 | 同理上面的\o12替换成\x0a会达到同样的目的。 注:\x0a是时间制的10,所以是换行。 |
9.3 字符串运算符
字符串可以通过一些运算符号实现对字符串的拼接、组装等操作。如下我们通过一个表格来了解下:
操作符 | 描述 | 代码示例 |
+ | 字符串连接 | a= 'hello' b='xiaodao' a+b 执行结果: helloxiaodao |
* | 重复输出字符串 | a= 'Hello' a*2 执行结果: HelloHello |
[] | 通过索引获取字符串中字符,这里下表从0开始。 | a= 'hello' a[1] 执行结果: e |
[ : ] | 截取字符串中的一部分,这里下表遵循左闭又开原则即右边的下表取不到。 | a= 'hello' a[1:4] 执行结果: ell |
in | 如果字符串中包含给定的字符返回 True,反之为False | a='hello' 'h' in a 执行结果: True |
not in | 如果字符串中不包含给定的字符返回 True,反之为False | a='hello' 'm' not in a 执行结果: True |
r/R | 输出原始字符串,这里使用了该符号后即便字符串里有特殊字符仍不会转义。保留原来的样子。 | print(r'\n') 执行结果:\n print(r'\\n') 执行结果:\\n print('\\n') 执行结果:\n print('\n') 执行结果:
|
% | 格式字符串 | print ("我叫 %s 今年 %d 岁!" % ('小明', 10.5)) 执行结果: 我叫 小明 今年 10 岁! |
操作符 | 描述 | 实例 |
9.4 字符串格式输出
字符串可以按照指定的格式输出,比如
符 号 | 描述 | 示例 |
%c | 格式化字符及其ASCII码值 | print ("我叫 %c" % ('三')) 执行结果: 我叫 三 |
%s | 格式化字符串 | print ("我叫 %s" % ('小三,我是%s方式输出的!')) 执行结果: 我叫 小三,我是%s方式输出的! |
%d | 格式化整数 | print ("我叫 %s 今年 %d 岁!" % ('小明', 10)) 执行结果: 我叫 小明 今年 10 岁! |
%u | 格式化无符号整型 | print ("我叫 %s 今年 %u 岁!" % ('小明', 10.00)) 执行结果: 我叫 小明 今年 10 岁! |
%o | 格式化无符号八进制数 | print ("我叫 %s 今年是八进制的 %o 岁!" % ('小明', 10)) 执行结果: 我叫 小明 今年是八进制的 12 岁! |
%x | 格式化无符号十六进制数 | print ("我叫 %s 今年是八进制的 %x 岁!" % ('小明', 10)) 执行结果: 我叫 小明 今年是八进制的 a岁! |
%X | 格式化无符号十六进制数,是大写方式。 | print ("我叫 %s 今年是八进制的 %X 岁!" % ('小明', 10)) 执行结果: 我叫 小明 今年是八进制的 A岁! |
%f | 格式化浮点数字,可指定小数点后的精度 | print ("我叫 %s 今年是浮点表示的 %f 岁!" % ('小明', 10.5)) 执行结果: 我叫 小明 今年是浮点表示的 10.500000 岁! |
%e | 用科学计数法格式化浮点数 | print ("我叫 %s 今年是科学计算法表示的 %e 岁!" % ('小明', 1e1)) 执行结果: 我叫 小明 今年是科学计算法表示的 1.000000e+01 岁! |
%E | 作用同%e,用科学计数法格式化浮点数,是大写方式。 | print ("我叫 %s 今年是科学计算法表示的 %e 岁!" % ('小明', 1E1)) 执行结果: 我叫 小明 今年是科学计算法表示的 1.000000E+01 岁! |
%g | %f和%e的简写 | print ("我叫 %s 今年是科学计算法表示的 %g 岁!" % ('小明', 1e1)) 执行结果: 我叫 小明 今年是科学计算法表示的 10 岁! |
%G | %f 和 %E 的简写 | print ("我叫 %s 今年是科学计算法表示的 %G 岁!" % ('小明', 1e1)) 执行结果: 我叫 小明 今年是科学计算法表示的 10 岁! |
9.5字符串内嵌函数
Python中内嵌了许多常用的函数,我们只要熟悉它们的功能即可轻松完成许多字符串处理工作。以下我们通过表格来认识下这些常用的函数:
函数名 | 描述 | 示例 |
capitalize | capitalize() 功能描述: 将字符串的首字符转为大写 | mystr='hi man!' print(mystr.capitalize()) 执行结果: Hi man! |
center | center(width, fillchar) 功能说明: 参数说明: Ø width:字符串的总宽度。 Ø fillchar:填充字符。 | str = "xiao dao bian cheng....wow!!!"; print ("str.center(36, 'a') : ", str.center(36,'a')) str.center(36, 'a') : aaaxiao dao bian cheng....wow!!!aaaa 注:这里以开头和结尾的两个a包围,因为str本身长度为32. |
count | count(sub, start= 0,end=len(string)) 返回 sub 在 string 里面出现的次数,如果 start 或者 end 指定则返回指定范围内 sub 出现的次数 参数说明: Ø sub:搜索的子字符串 Ø start:字符串开始搜索的位置。默认为第一个字符,其索引值为0。 Ø end:字符串中结束搜索的位置。默认为字符串的最后一个位置。 | mystr='xiaodaobiancheng' print("第3个位置后a出现的次数",mystr.count('e',2,len(mystr))) print("第3个位置后a出现的次数",mystr.count('a',2,len(mystr))) print("第3个位置后a出现的次数",mystr.count('a',3,len(mystr))) 执行结果: 第3个位置后a出现的次数 1 第3个位置后a出现的次数 3 第3个位置后a出现的次数 2 |
encode | encode(encoding='UTF-8',errors='strict') 功能描述: 参数说明: Ø encoding:要使用的编码,如: UTF-8。 Ø errors :设置不同错误的处理方案。默认为 'strict',意为编码错误引起一个UnicodeError。 其他可能得值有 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' 以及通过 codecs.register_error() 注册的任何值。 | mystr = "趣味编程"; str_utf8 = mystr.encode("UTF-8") str_gbk = mystr.encode("GBK") print("mystr的内容是:"+mystr) print("UTF-8编码mystr:", str_utf8) print("GBK编码mystr:", str_gbk) print("UTF-8解码:",str_utf8.decode('UTF-8','strict')) print("GBK解码:", str_gbk.decode('GBK','strict')) 执行结果: mystr的内容是:趣味编程 UTF-8编码mystr: b'\xe5\xb0\x8f\xe9\x81\x93\xe7\xbc\x96\xe7\xa8\x8b' GBK编码mystr: b'\xd0\xa1\xb5\xc0\xb1\xe0\xb3\xcc' UTF-8 解码: 趣味编程 GBK 解码: 趣味编程 注:以上是每个print执行的结果的罗列,每个print之后都会有相应结果。 |
decode | decode(encoding="utf-8", errors="strict") 功能说明: 参数说明: Ø encoding:要使用的编码,如”UTF-8″。 Ø errors :设置不同错误的处理方案。默认为 'strict',意为编码错误引起一个UnicodeError。 其他可能得值有 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' 以及通过 codecs.register_error() 注册的任何值。 | mystr = "趣味编程"; str_utf8 = mystr.encode("UTF-8") str_gbk = mystr.encode("GBK") print("mystr的内容是:"+mystr) print("UTF-8编码mystr:", str_utf8) print("GBK编码mystr:", str_gbk) print("UTF-8解码:",str_utf8.decode('UTF-8','strict')) print("GBK解码:", str_gbk.decode('GBK','strict')) 执行结果: mystr的内容是:趣味编程 UTF-8编码mystr: b'\xe5\xb0\x8f\xe9\x81\x93\xe7\xbc\x96\xe7\xa8\x8b' GBK编码mystr: b'\xd0\xa1\xb5\xc0\xb1\xe0\xb3\xcc' UTF-8 解码: 趣味编程 GBK 解码: 趣味编程 注:以上是每个print执行的结果的罗列,每个print之后都会有相应结果。 |
startswith | startswith(str, beg=0,end=len(string)) 功能说明: 参数说明: Ø str : 检测的字符串。 Ø beg:选参数用于设置字符串检测的起始位置。 Ø end:可选参数用于设置字符串检测的结束位置。 | mystr='xiaodaobianchengxngxng' suffix='x' print ("'"+mystr+"'"+"是以x开头?"+str(mystr.startswith(suffix))) print("'"+mystr+"'"+"的长度是:"+str(len(mystr))) print ("'"+mystr+"'"+"从第17到19位置时以x开头?"+str(mystr.startswith(suffix,17,19)))
执行结果: 'xiaodaobianchengxngxng'是以x开头?True 'xiaodaobianchengxngxng'的长度是:22 'xiaodaobianchengxngxng'从第17到19位置时以x开头?False |
endswith | endswith(suffix,start=0,end=len(string)) 功能说明: 判断字符串是否以指定后缀结尾,如果以指定后缀结尾返回True,否则返回False。可选参数”start”与”end”为检索字符串的开始与结束位置。 参数说明: Ø suffix: 该参数可以是一个字符串或者是一个元素。 Ø start:字符串中的开始位置。 Ø end:字符中结束位置。
| mystr='xiaodaobianchengxngxng' suffix='ng' print(len(mystr)) print (mystr.endswith(suffix, 0, 19))
执行结果: True 22 True |
expandtabs | expandtabs(tabsize=8) 功能说明: 参数说明: Ø tabsize:指定转换字符串中的 tab 符号('\t ')转为空格的字符数。 | mystr='xiaodaobian\tchengxngxng' print ("替换 \\t符号: " + mystr.expandtabs()) print ("使用16个空格替换 \\t 符号: " + mystr.expandtabs(16)) 执行结果: 替换 \t 符号: xiaodaobian chengxngxng 使用16个空格替换 \t 符号: xiaodaobian chengxngxng |
find | find(str, beg=0 end=len(string)) 功能说明: 参数说明: Ø str :定检索的字符串 Ø beg :开始索引,默认为0。 Ø end :结束索引,默认为字符串的长度。 | mystr='xiaodaobiantchengxngxng' str2='ng' print ("'ng'所在索引序号为:"+str(mystr.find(str2))) print ("'ng'所在索引序号为:"+str(mystr.find(str2,17))) print ("'ng'所在索引序号为:"+str(mystr.find(str2,20))) print ("'ng'所在索引序号为:"+str(mystr.find(str2,30))) 执行结果: 'ng'所在索引序号为:15 'ng'所在索引序号为:18 'ng'所在索引序号为:21 'ng'所在索引序号为:-1 |
rfind | rfind(str, beg=0,end=len(string)) 功能说明: | mystr='xiaodaobiantchengxngxng' str2='ng' 执行结果: 21 |
index | index(str, beg=0, end=len(string)) 功能说明: 功能类似find()方法,只不过如果str不在字符串中会报一个异常. 参数说明: Ø str :定检索的字符串 Ø beg :开始索引,默认为0。 Ø end :结束索引,默认为字符串的长度。
| mystr='xiaodaobiantchengxngxng' str2='ng' print ("'ng'所在索引序号为:"+str(mystr.index(str2))) print ("'ng'所在索引序号为:"+str(mystr.index(str2,17))) print ("'ng'所在索引序号为:"+str(mystr.index(str2,20))) print ("'ng'所在索引序号为:"+str(mystr.index(str2,30))) 执行结果: 'ng'所在索引序号为:15 'ng'所在索引序号为:18 'ng'所在索引序号为:21 Traceback (most recent call last):
print ("'ng'所在索引序号为:"+str(mystr.index(str2, 30))) ValueError: substring not found
|
rindex | rindex( str, beg=0, end=len(string)) 功能说明: | mystr='xiaodaobiantchengxngxng' str2='ng' 执行结果: 21 |
isalnum | isalnum() 功能说明: | mystr='xiaodaobiantchengxngxng' print("'"+mystr+"'"+"是不是个数字字母:"+str(mystr.isalnum())) 执行结果: 'xiaodaobiantchengxngxng'是不是个数字字母:True |
isalpha | isalpha() 功能说明: | mystr='xiaodaobiantchengxngxng!' print("'"+mystr+"'"+"是不是个数字字母:"+str(mystr.isalnum())) print("'"+mystr+"'"+"是一个alpha:"+str(mystr.isalpha())) 执行结果: 'xiaodaobiantchengxngxng!'是不是个数字字母:False 注:这里最后一个字母是!号,所以返回为false。 |
isdigit | isdigit() 功能说明: | mystr='xiaodaobiantchengxngxng!' digitstr='123' print("'"+mystr+"'是数字:"+str(mystr.isdigit())) print("'"+digitstr+"'是数字:"+str(digitstr.isdigit())) 执行结果: 'xiaodaobiantchengxngxng!'是数字:False '123'是数字:True |
isdecimal | isdecimal() 功能说明: | digitstr='123' print("'"+digitstr+"'是数字:"+str(digitstr.isdecimal ())) 执行结果: '123'是数字:True |
isnumeric | isnumeric() 功能说明: | mystr = "xiaodao2017" print ("'"+mystr+"'"+"是不是纯数字:"+str(mystr.isnumeric())) mystr = "23443434" print ("'"+mystr+"'"+"是不是纯数字:"+str(mystr.isnumeric())) 执行结果: 'xiaodao2017'是不是纯数字:False '23443434'是不是纯数字:True |
isspace | isspace() 功能说明: | mystr = " " print ("'"+mystr+"'"+"是不是纯数字:"+str(mystr.isspace())) mystr = "xiao dao biancheng" print ("'"+mystr+"'"+"是不是纯数字:"+str(mystr.isspace())) 执行结果: ' '是不是纯数字:True 'xiao dao biancheng'是不是纯数字:False |
istitle | istitle() 功能说明: 方法检测字符串中所有的单词拼写首字母是否为大写,且其他字母为小写。 | mystr = "This is a string xiaodao" print ("'"+mystr+"'"+"是不是每个单词首字符大写:"+str(mystr.istitle())) mystr = "This Is A String Xiaodao" print ("'"+mystr+"'"+"是不是每个单词首字符大写:"+str(mystr.istitle())) 执行结果: 'This is a string xiaodao'是不是每个单词首字符大写:False 'This Is A String Xiaodao'是不是每个单词首字符大写:True
|
title | title() 功能说明: | mystr = "This is a string xiaodao" print ("'"+mystr+"'"+"里的每个首字符被大写:"+str(mystr.title()))
执行结果: 'This is a string xiaodao'里的每个首字符被大写:This Is A String Xiaodao |
isupper | isupper() 功能说明: | mystr = "xiaodao" print ("'"+mystr+"'"+"里的每个首字符被大写:"+str(mystr.isupper())) 执行结果: 'xiaodao'里的每个首字符被大写:False |
islower | islower() 功能说明: | mystr = "xiaodao" print ("'"+mystr+"'"+"里的每个首字符被大写:"+str(mystr.islower())) 执行结果: xiaodao'里的每个首字符被大写:True |
upper | upper() 功能说明: 将字符串中里每个字符转成大写。 | mystr = "xiaodao" print ("'"+mystr+"'"+"里的每个首字符被大写:"+str(mystr.upper())) 执行结果: 'xiaodao'里的每个首字符被大写:XIAODAO |
lower | lower() 功能说明: 将字符串中里每个字符转成小写。 | mystr = "XIAODAO" print ("'"+mystr+"'"+"里的每个首字符被大写:"+str(mystr.lower())) 执行结果: 'XIAODAO'里的每个首字符被大写:xiaodao
|
swapcase | swapcase() 功能说明: | mystr='xiaodaobiancheng' print('大小写转换:'+mystr.swapcase()) print('大小写转换:'+mystr.swapcase().swapcase()) 执行结果: 大小写转换:XIAODAOBIANCHENG 大小写转换:xiaodaobiancheng |
len | len(string) 功能说明: 参数说明: Ø 字符串string | mystr = "XIAODAO" print ("'"+mystr+"'"+"里的每个首字符被大写:"+str(len(mystr))) 执行结果: 'XIAODAO'里的每个首字符被大写:7 |
max | 功能说明: | mystr = "XIAODAO" print ("'"+mystr+"'"+"里字符的最大值:"+str(max(mystr))) print("10,20,5里的最大值:"+str(max(10,20,5)))
执行结果: 'XIAODAO'里的每个首字符被大写:X 10,20,5里的最小值:20 |
min | 功能说明: | mystr = "XIAODAO" print ("'"+mystr+"'"+"字符串里的最小值:"+str(min(mystr))) print("10,20,5里的最小值:"+str(min(10,20,5)))
执行结果: 'XIAODAO'里的每个首字符被大写:A 10,20,5里的最小值:5 |
join | join(seq) 功能说明: 参数说明: Ø seq: 要连接的元素序列。
| mystr = "_"; seq = ("xiao", "dao", "bian", "cheng"); # 字符串序列 print( mystr.join( seq )); 执行结果: xiao_dao_bian_cheng |
ljust | ljust(width[, fillchar]) 功能说明: 参数说明: Ø width:指定字符串长度。 Ø fillchar : 填充字符,默认为空格。
| mystr='xiaodaobiancheng' print(mystr.ljust(20,'*')); 执行结果: xiaodaobiancheng**** |
rjust | rjust(width[, fillchar]) 功能说明: 参数说明: Ø width:指定字符串长度。 fillchar : 填充字符,默认为空格 | mystr='xiaodaobiancheng' print(mystr.rjust(20,'*'));
执行结果: ****xiaodaobiancheng |
lstrip | lstrip() 功能说明: | mystr=' xiaodao biancheng' print('去除左侧空格:'+mystr.lstrip()) 执行结果: 去除左侧空格:xiaodao biancheng |
rstrip | rstrip() 功能说明: 截掉字符串尾部的空格
| mystr=' xiaodao biancheng ' print('尾部去除空格:'+mystr.rstrip()) 执行结果: 尾部去除空格: xiaodao biancheng |
strip | strip() 功能说明: 截掉字符串头部和尾部的空格
| mystr=' xiaodaobiantchengxngxng ' 执行结果: xiaodaobiantchengxngxng |
zfill | zfill (width) 功能说明: 参数说明: Ø width: 指定字符串的长度。原字符串右对齐,前面填充0。 | mystr = "xiao dao bian cheng!!!" print(mystr.zfill(30)) 执行结果: 00000000xiao dao bian cheng!!! |
replace | replace(old, new [, max]) 功能说明: 参数说明: Ø old :将被替换的子字符串。 Ø new :新字符串,用于替换old子字符串。 Ø max :可选字符串, 替换不超过 max 次 | mystr=' xiaodao biancheng' print("替换'ao'为'what'"+mystr.replace('ao','what')) print("替换'ao'为'what'2次"+mystr.replace('ao','what',2))
执行结果: 替换'ao'为'what' xiwhatdwhat biancheng 替换'ao'为'what'2次 xiwhatdwhat biancheng |
split | split(str="", num=string.count(str)) num=string.count(str)) 功能说明: 以 str 为分隔符截取字符串,如果 num 有指定值,则仅截取 num 个子字符串 参数说明: Ø str:分隔符,默认为空格。 Ø num : 分割次数。 | mystr = "xiao dao bian cheng!!!" mystr2 = "xiaao daao baaian cheng!!!" print (mystr.split('a',1)) print (mystr2.split('a',2)) print (mystr.split('n'))
执行结果: ['xiao', 'dao', 'bian', 'cheng!!!'] ['xi', 'o dao bian cheng!!!'] ['xi', '', 'o daao baaian cheng!!!'] ['xiao dao bia', ' che', 'g!!!'] |
splitlines | splitlines() 功能说明: | mystr = "xiao\ndao\nbian\ncheng!!!" 执行结果: ['xiao', 'dao', 'bian', 'cheng!!!'] |
maketrans | maketrans(intab, outtab) 功能说明: 参数说明: Ø intab — 字符串中要替代的字符组成的字符串。 Ø outtab — 相应的映射字符的字符串。 | intab = "aeiou" outtab = "12345" trantab = str.maketrans(intab, outtab) mystr = "xiao dao bian cheng!!!" 执行结果: x314 d14 b31n ch2ng!!! |
translate | translate(table, deletechars="") 功能说明: 参数说明: Ø table:翻译表,翻译表是通过maketrans方法转换而来。 Ø deletechars:字符串中要过滤的字符列表 | intab = "aeiou" outtab = "12345" trantab = str.maketrans(intab, outtab) mystr = "xiao dao bian cheng!!!" 执行结果: x314 d14 b31n ch2ng!!! |
partition | partition(str) 功能说明: 该方法用来根据指定的分隔符将字符串进行分割。 如果字符串包含指定的分隔符,则返回一个3元的元组,第一个为分隔符左边的子串,第二个为分隔符本身,第三个为分隔符右边的子串。 参数说明: Ø str:指定的分隔符。 | mystr='xiao dao bian cheng' print(mystr.partition(' ')) 执行结果: ('xiao', ' ', 'dao bian cheng') |
rpartition | rpartition() 功能说明: 功能类似partition,只是从右边开始查找。 参数说明: Ø str:指定的分隔符。 | mystr='xiao dao bian cheng' print(mystr.rpartition(' ')) 执行结果: ('xiao dao bian', ' ', 'cheng') |
9.6 总结
通过本章的学习我们了解了字符串里常用的处理方法,为我们后期的程序开发奠定了坚实的基础。接下来我们学习下python里的输入输出。