第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的世界。 

    欢迎大家批评指正,谢谢大家关注!

posted @ 2019-04-19 23:34  老猿学Python  阅读(94)  评论(0编辑  收藏  举报