第3.7节 再说字符串
一、 字符串补充知识
1. 上节介绍的三引号是三个单引号,经查有关资料及验证,确认三个双引号也可以。非常抱歉误导大家了;
2. 原始字符串:原始字符串就表示字符串中的信息如果存在反斜杠不会进行转义,直接将反斜杠(\)作为一个字符串中的字符。但原始字符串不能以单个反斜杠结尾,如果要指定以反斜杠结尾的原始字符串(如以反斜杠结尾的DOS路径),是将反斜杠单独作为一个字符串。原始字符串在普通字符串前加前缀r表示。示例:
rs = r'C:\Program Files\foo\bar\n'+'\\'
print(rs) #输出C:\Program Files\foo\bar\n\
rs #输出'C:\\Program Files\\foo\\bar\\n\\'
3. 多个字符串连着写等同于字符串拼接,如:
s='This ''is '+'a test' #结果s='This is a test'
二、 字符串更多的操作方法
1. find (substr[, start[, end]])在字符串中查找子串,还可指定搜索的起点和终点(它们都是可选的)。如果找到,就返回子串的第一个字符的索引,否则返回-1。类似方法还有:
1) rfind:调用格式与find相同,其返回值是在查找字符串中找到的最后一个子串的索引值,找不到返回-1;
2) index、rindex:与find与rfind类似,只是找不到的时候返回的异常ValueError;
3) count(sub[, start[, end]]):返回找到子字符串的个数;
4) startswith (prefix[, start[, end]]):判断字符串指定位置是否开始于参数对应的前缀字符串;
5) endswith (suffix [, start[, end]]):判断字符串指定位置是否结束于参数对应的后缀字符串;
2. 方法replace (old, new, count=-1, /),将指定子串old都替换为另一个字符串new,并返回替换后的结果,而原字符串保持不变,count表示最多替换多少次,-1替换所有。如:
s="This is a dog!It's name is Coffee!"
s.replace('is','iis',2) #执行后返回"Thiis iis a dog!It's name is Coffee!"
此时s="This is a dog!It's name is Coffee!" 保持不变
3. 方法translate(table):方法translate与replace一样替换字符串的特定部分,但不同的是它只能进行单字符替换。这个方法的优势在于能够同时替换多个字符,因此效率比replace高。使用translate前必须创建一个转换表table。这个转换表指出了不同字符之间的转换关系。要创建转换表,可对字符串类型str调用静态方法maketrans返回一个可供 str.translate() 使用的转换对照表。
maketrans如果只有一个参数,则它必须是一个将 Unicode 码位序号(整数)或字符(长度为 1 的字符串)映射到 Unicode 码位序号、(任意长度的)字符串或 None 的字典。相当于字典中记录了新旧字符的映射关系。字符键将会被转换为码位序号。
如果有两个参数,则它们必须是两个长度相等的字符串,并且在结果字典中,x 中每个字符将被映射到 y 中相同位置的字符。 如果有第三个参数,它必须是一个字符串,其中的字符将在结果中被映射到 None。就是第三个参数字符串中的字符被返回字符串中删除。
table = str.maketrans('IS', 'is')
如果愿意,可查看转换表的内容,但你看到的只是Unicode码之间的映射。
table={73: 105, 83: 115}
创建转换表后,就可将其用作方法translate的参数。调用方法maketrans时,还可提供可选的第三个参数,指定要将哪些字母删除。
s='This*$IS$*A&*TEST****???///$$$###'
t=s.maketrans('AISTE*?','aiste !','$#/&') #创建转换表,同时指定删除‘$#/&’
news=s.translate(t) #返回后news='this is a test !!!'
d={'*':' ','$':'','$':'','#':'','?':'!'} #通过键对应值为空将键对应字符删除
t=s.maketrans(d)
news=s.translate(t) #返回后news='This IS A& TEST !!!///'
4. split(sep=None, maxsplit=-1)方法:返回一个由字符串内单词组成的列表,使用 sep 作为分隔字符串。 如果给出了 maxsplit,则最多进行 maxsplit 次拆分(因此,列表最多会有 maxsplit+1 个元素)。 如果 maxsplit 未指定或为 -1,则不限制拆分次数(进行所有可能的拆分)。如果给出了 sep,则连续的分隔符不会被组合在一起而是被视为分隔空字符串 (例如 '1,,2'.split(',') 将返回 ['1', '', '2'])。 sep 参数可能由多个字符组成 (例如 '1<>2<>3'.split('<>') 将返回 ['1', '2', '3'])。 使用指定的分隔符拆分空字符串将返回 ['']。。
5. rsplit(sep=None, maxsplit=-1)方法:返回一个由字符串内单词组成的列表,使用 sep 作为分隔字符串。 如果给出了 maxsplit,则最多进行 maxsplit 次拆分,从 最右边 开始。 如果 sep 未指定或为 None,任何空白字符串都会被作为分隔符。除了从右边开始拆分,rsplit() 的其他行为都类似于split();
6. splitlines([keepends])方法:返回由原字符串中各行组成的列表,在行边界的位置拆分。 结果列表中不包含行边界,除非给出了 keepends=True。对于空字符串此方法将返回一个空列表,而末尾的换行不会令结果中增加额外的行。
此方法会以下列行边界进行拆分。行边界是 universal newlines 的一个超集,包括如下:
表示符 描述
1) \n 换行
2) \r 回车
3) \r\n 回车 + 换行
4) \v 或 \x0b 行制表符
5) \f 或 \x0c 换表单
6) \x1c 文件分隔符
7) \x1d 组分隔符
8) \x1e 记录分隔符
9) \x85 下一行 (C1 控制码)
10) \u2028 行分隔符
11) \u2029 段分隔符
7. rpartition(sep)方法:在 sep 最后一次出现的位置拆分字符串,返回一个 3 元组,其中包含分隔符之前的部分、分隔符本身,以及分隔符之后的部分。 如果分隔符未找到,则返回的 3 元组中包含两个空字符串以及字符本身;
8. join方法:作用与split相反,用于合并序列的元素,所合并序列的元素必须都是字符串,要将字符列表转换为字符串,可使用''.join(somelist)
9. ljust(width[, fillchar])方法:返回长度为 width 的字符串,原字符串在其中靠左对齐。 使用指定的 fillchar 填充空位 (默认使用 ASCII 空格符)。 如果 width 小于等于 len(s) 则返回原字符串的副本。
10. rjust(width[, fillchar])方法:返回长度为 width 的字符串,原字符串在其中靠右对齐。 使用指定的 fillchar 填充空位 (默认使用 ASCII 空格符)。 如果 width 小于等于 len(s) 则返回原字符串的副本;
11. center方法:通过在两边添加填充字符(默认为空格)让字符串居中;
12. zfill(width)方法:返回原字符串的副本,在左边填充 ASCII '0' 数码使其长度变为 width。 正负值前缀 ('+'/'-') 的处理方式是在正负符号 之后 填充而非在之前。 如果 width 小于等于 len(s) 则返回原字符串的副本。
13. 方法strip:上一节简单介绍了,将字符串开头和末尾的空白(但不包括中间的空白)删除,并返回删除后的结果,除此之外还可在一个字符串参数中指定在前后要删除哪些字符
'*** SPAM * for * everyone!!! ***'.strip(' *!')
'SPAM * for * everyone'
14. casefold()方法:返回原字符串转换为小写的副本。 与low相比它会移除字符串中的所有大小写变化形式。 例如,德语小写字母 ' ?' 相当于 "ss"。 由于它已经是小写了,lower() 不会对 ' ?' 做任何改变;而 casefold() 则会将其转换为 "ss";
15. swapcase()方法:返回原字符串的副本,其中大写字符转换为小写,反之亦然。
16. expandtabs(tabsize=8):返回字符串的副本,其中所有的制表符会由一个或多个空格替换,具体取决于当前列宽度和给定的制表符宽度。 每 tabsize 个字符设为一个制表位(默认值 8 时设定的制表位在列 0, 8, 16 依次类推)。 要展开字符串,当前列将被设为零并逐一检查字符串中的每个字符。 如果字符为制表符 (\t),则会在结果中插入一个或多个空格符,直到当前列等于下一个制表位。 (制表符本身不会被复制。) 如果字符为换行符 (\n) 或回车符 (\r),它会被复制并将当前列重设为零。 任何其他字符会被不加修改地复制并将当前列加一,不论该字符在被打印时会如何显示。。
17. 判断字符串是否满足特定的条件,上一节介绍了istitle、isupper、islower,很多字符串方法都以is打头,如isspace、isdigit和isupper,它们判断字符串是否具有特定的性质(如包含的字符全为空白、数字或大写)。如果字符串具备特定的性质,这些方法就返回True,否则返回False。如:isalnum(是否为字母或数字)、isalpha(是否为字母)、isdecimal、isdigit、isidentifier(是否标识符)、isnumeric、isprintable、isspace。其中isdecimal 、isdigit、isnumeric的区别如下:
Isdecimal:是否为十进制数字符,包括Unicode数字、双字节全角数字,不包括罗马数字、汉字数字、小数;
Isdigit:是否为数字字符,包括Unicode数字,单字节数字,双字节全角数字,不包括汉字数字,罗马数字、小数
Isnumeric:是否所有字符均为数值字符,包括Unicode数字、双字节全角数字、罗马数字、汉字数字,不包括小数
举例:
def isnumber(s):
print(s+':',s.isdigit())
print(s+':',s.isdecimal())
print(s+':',s.isnumeric())
执行函数isnumber('123'),三个都是True,执行函数isnumber('123.0'),三个都是False,执行函数isnumber('壹贰叁'),打印分别是False、False、True,罗马数字也是一样的结果。
18. ord(c)函数:返回字母c的unicode码,ASCII字符返回的就是ASCII码;
19. chr(i)函数:返回一个unicode码对应的字符,0 <= i <= 0x10ffff。
本节继续补充介绍了字符串的一些概念和更多的操作方法,内容好理解,稍微复杂点的举例进行了说明,大家可以自行练习。后续章节将介绍字符串的高级功能。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!