Python3学习笔记 | 五、Python的类型与运算-字符串(下)
- 2019 年 10 月 6 日
- 筆記
一、字符串方法
除表达式之外,字符串还提供了一系列的方法去实现更复杂的文本处理任务。方法是与特定的对象相关联在一起的函数。从技术角度来讲,它们附属于对象的属性,而这些属性不过是些调用函数罢了。在Python中,表达式和内置函数可能在不同范围的类型有效,但方法通常特定于对象类型,例如,字符串方法仅适用于字符串对象。
属性读取: Object.attribute格式的表达式可以理解为“读取object对象的属性attribute值”
函数调用表达式: 具有函数(参数)格式的表达式意味着“调用函数代码,传递零或者更多用逗号隔开的参数对象,最后返回函数的返回值”。
这两者合并可以让我们调用一个对象方法。
有如下几种字符串方法: 大小写相关: • S.capitalize()/S.title()/S.upper()/S.lower()/S.swapcase() 排版相关: • S.center(width[, fill])/ S.ljust(width[, fill])/S.rjust(width[, fill])/ S.expandtabs(tabsize)/S.zfill(width) • S.strip([chars])/S.lstrip([chars])/S.rstrip([chars]) 查找相关: • S.startswith(prefix[, start[, end]])/S.endswith(suffix[ ,start[ ,end]])/ S.count(sub[, start[, end]]) • S.find(sub [, start[, end]])/S.rfind(sub[, start[, end]])/S.replace(old, new[, count]) • S.index(sub[, start[, end]])/S.rindex(sub[, start[, end]]) 格式判断: • S.isalpha()/S.isdigit()/S.isalnum()/S.islower/S.isupper()/S.isspace()/S.istitle() • S.isdecimal()/S.isnumeric()/S.isidentifier()/S.isprintable() - Python3.x 字符分隔: • S.split([sep[, maxsplit]])/S.rsplit([sep[, maxsplit]])/S.splitlines([keepends])/S.partition(sep)/S.rpartition(sep) 其他: • S.join(iterable) • S.maketrans(x[, y[, z]])/S.translate(map) - Python3.x • S.format()
1、大小写
S.capitalize() - 第一个字母大写,其余都变成小写字母。
>>> 'Dora EmON'.capitalize() 'Dora emon'
S.title() - 每一词的头字母大写,其余都变成小写字母。
>>> 'Dora EmON'.title() 'Dora Emon'
S.upper() - 全改成大写
>>> 'Dora EmON'.upper() 'DORA EMON'
S.lower() - 全改成小写
>>> 'Dora EmON'.lower() 'dora emon'
S.swapcase() - 大小写转换
>>> 'Dora EmON'.swapcase() 'dORA eMon'
2、排版
S.center(width[, fill])/ S.ljust(width[, fill])/S.rjust(width[, fill]) - 原来的字符扩到指定长度,再用fill来填充其余空处,默认空格。中间对齐/左对齐/右对齐。
>>> 'DoraEmon'.center(15) ' DoraEmon ' >>> 'DoraEmon'.center(15,'十') '十十十十DoraEmon十十十' >>> 'DoraEmon'.ljust(15) 'DoraEmon >>> 'DoraEmon'.rjust(15,'十') '十十十十十十十DoraEmon'
S.expandtabs(tabsize) - 更改tabs(在字符串里”t”)转换为空格的数量,默认为8。
>>> 'DoratEmon'.expandtabs(8) 'Dora Emon' >>> 'DoratEmon'.expandtabs(16) 'Dora Emon'
S.zfill(width) - 原来的字符串扩到指定长度,前面使用0来填充,数字计算的时候会用到。
>>> 'DoraEmon'.zfill(15) '0000000DoraEmon'
S.strip([chars])/S.lstrip([chars])/S.rstrip([chars]) - 删除两遍/左边/右边的指定字符(默认为空格和换行符)。
>>> ' DoraEmonn '.strip() 'DoraEmon' >>> ' DoraEmonn '.lstrip() 'DoraEmonn ' >>> ' DoraEmonn '.rstrip() ' DoraEmon' >>> ' DoraEmonn '.strip('Em') ' DoraEmonn '
3、查找
在这里所有的start和start, end看成是是S[start:]和S[start:end]
S.startswith(prefix[, start[, end]])/S.endswith(suffix[ ,start[ ,end]])- 以特定字符串开头/结尾的,返回真假。
>>> 'DoraEmon'.startswith('D') True >>> 'DoraEmon'.startswith('D',2,3) False >>> 'DoraEmon'.endswith('o',6,7) True
S.count(sub[, start[, end]])- 相应字符串在文本里的个数。
>>> 'DoraEmon'.count('o') 2 >>> 'DoraEmon'.count('o',1,5) 1
S.find(sub [, start[, end]])/S.rfind(sub[, start[, end]])- 查找第一个与sub匹配的字符串位置,没找到返回-1。
>>> 'DoraEmon'.find('D') 0 >>> 'DoraEmon'.find('E') 4 >>> 'DoraEmon'.find('E',3,5) 4 >>> 'DoraEmon'.find('Q') -1
S.index(sub[, start[, end]])/S.rindex(sub[, start[, end]])- 与find差不多,但没找到会返回错误。
>>> 'DoraEmon'.index('D') 0 >>> 'DoraEmon'.index('E') 4 >>> 'DoraEmon'.index('E',3,5) 4 >>> 'DoraEmon'.index('Q') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: substring not found
S.replace(old, new[, count])- 查找old,替换成new,count是只替换相应个数,默认全替换。
>>> 'DoraEmon'.replace('o','Xiong',) 'DXiongraEmXiongn' >>> 'DoraEmon'.replace('o','Xiong',1) 'DXiongraEmon'
4、格式判断
返回的值都是真或者假。 S.isalpha() - 判断是不是字母 S.isdigit() - 判断是否数字 S.isalnum() - 判断是否数字和字母 S.islower() - 判断是不是有字母而且是全小写 S.isupper() - 判断是不是有字母而且是全大写 S.isspace() - 判断是不是只有空格和换行符号 S.istitle() - 判断每个单词第一个字母是不是大写
>>> 'DoraEmon'.isalpha() True >>> 'DoraEmon'.isdigit() False >>> 'DoraEmon'.isalnum() True >>> 'DoraEmon'.islower() False >>> 'DoraEmon'.isupper() False >>> 'DoraEmon'.isspace() False >>> 'DoraEmon'.istitle() False
下面的只有Python3.x开始支持 S.isdecimal() - 判断是不是数字 S.isnumeric() - 判断是不是数字 S.isidentifier() - 判断字符能否成为标识符 S.isprintable() - 判断字符是否全部是能打印(print)的
>>> 'DoraEmon'.isdecimal() False >>> 'DoraEmon'.isnumeric() False >>> 'DoraEmon'.isidentifier() True >>> 'DoraEmon'.isprintable() True
5、字符分割
S.split([sep[, maxsplit]])/S.rsplit([sep[, maxsplit]])- 从左/右以sep(字符串)分隔,最多maxsplit次(默认无限)
>>> 'DoraEmon'.split('o') ['D', 'raEm', 'n'] >>> 'DoraEmon'.split('o',1) ['D', 'raEmon'] >>> 'DoraEmon'.rsplit('o',1) ['DoraEm', 'n']
S.splitlines([keepends])- 以n或者r或者rn分隔
>>> 'DnorraEmornn'.splitlines() ['D', 'o', 'raEmo', 'n']
S.partition(sep)/S.rpartition(sep)- 从左/右找第一个sep分隔,sep左边的,sep,sep右边的。
>>> 'DoraEmon'.partition('o') ('D', 'o', 'raEmon') >>> 'DoraEmon'.rpartition('o') ('DoraEm', 'o', 'n')
6、其他
S.join(iterable) S.maketrans(x[, y[, z]])/S.translate(map)-创建对照表, 然后使用translate()函数, 调用对照表, 把字符串(string)中的字符, 进行相应的替换,这个在python2.x和python3.x完全不同。 S.format-字符串格式化方法,后面会详细讲解
>>> '-'.join('DoraEmon') 'D-o-r-a-E-m-o-n' >>> >>> D='DoraEmon' >>> X=D.maketrans('Dora','DaXo') >>> D.translate(X)'DaXoEman' >>> >>> 'DoraEmon{DA}'.format(DA=' And DaXiong') 'DoraEmon And DaXiong'
二、字符串格式化表达式
这个格式化表达式与C语言的差不多。
>>> '%d%s%s4'%(1,'2','Three') '12Three4'
格式是字符串里有%[(name)][flag][width][.precision]typecode加一个%, 再加上相应个数的元组(后面会讲元组)
1、格式化代码(typecode)
s 字符串(或任何对象) r 与s一样,但输出方式是repr方式,而不是str c 字符 d 十进制(整数) i 整数 u 无号整数 o 八进制整数 x 十六进制整数 X 与x同样,A-F是大写 e 浮点指数 E 与e同样,E是大写 f 浮点数十进制 F 浮点数十进制 g 浮点e或f G 浮点E或F
2、例子
>>> "%s | %r | %c" %("This is string","This is repr","C") "This is string | 'This is repr' | C" >>> "%d | %i | %o | %x | %x"%(3,5,11,13,15) '3 | 5 | 13 | d | f' >>> "%e | %E | %f | %F | %g | %G" %(1.5E3,1.5e3,13.5,13.5,1.5E13,13.5e15) '1.500000e+03 | 1.500000E+03 | 13.500000 | 13.500000 | 1.5e+13 | 1.35E+16' >>> "%(string)-10s" %({'string':'1'}) '1 >>> "%(float)+10.2f" % ({'float':3.1}) ' +3.10' >>> "%(float)-10.2f" % ({'float':3.1}) '3.10
三、字符串格式化方法
在Python字符串方法里有format方法,根据特定的格式在里面输入相应关键字。例: ‘What do you like, {0}, {1} or {2}’.format(“spam”, “eggs”, “ham”) 结果是’What do you like, spam, eggs, ham’ 也可以换顺序 : ‘What do you like, {2}, {1} or {0}’.format(“spam”, “eggs”, “ham”) 结果是’What do you like, ham, eggs, spam’ 也可以使用相应的名字 ‘What do you like, {ham}, {0} or {eggs}’.format(“spam”, eggs=”eggs”, ham=”ham”) 结果是’What do you like, ham, spam, eggs’ 具体格式为: {fieldname!conversionflag:formatspec} fieldname是位置信息或关键字,后面可以跟属性或指针 conversionflag是r或者s,分别对应repr和str formatspec是具体显示方式,可以替代前面所使用过的其他字符串方法
fieldtype 使用属性或指针
>>> import sys >>> sys.platform 'win32' >>> "{0.platform}".format(sys) 'win32' >>> "{0[Dora]}".format({"Dora":"DoraEmon"}) 'DoraEmon' >>> dict1={"Dora":"DoraEmon"} #关于字典,后面会讲到。 >>> dict1["Dora"] 'DoraEmon'
当使用字典的时候需要引号来扩,但使用字符串格式化方法的时候不能使用引号
formatspec = [[fill]align][sign][#][0][width][,][.precision][type],fill和align再加上后面的width相当于方法里的center,ljust,rjust
>>> "{:*^40}".format("start") '*****************start******************' >>> "{:*^40}".format("end") '******************end*******************'
这里也是,fill必须是单个字符。 align有<左对齐,>右对齐,^中间显示,=,在数字里符号在最前,数字右对齐。
>>> print("{:=10}n{:=+10}n{:-^10}n{:=+10}".format(10,3,'-',13)) 10 + 3 ---------- + 13
sign的值是+,-和空格。当+的时候,即使是正数,也会显示符号,-是只有在负数时显示符号(默认值),空格时,会为正数前面留下符号位
>>> "{:+}".format(10) '+10' >>> "{:-}".format(10) '10' >>> "{:-}".format(-10) '-10' >>> "{}".format(10) '10' >>> "{:}".format(10) '10'
只有在数字显示里,显示二进制数,八进制数,十六进制数的时候,需要显示前面的0b,0o,0x的时候使用。
>>> "{0:#8b},{0:#8o},{0:#8x}".format(10) ' 0b1010, 0o12, 0xa' >>> "{:,}".format(10000000) '10,000,000' >>> "{:08.5}".format(13.5767) '0013.577'
type跟之前使用%表示的相等。当字符时:使用s,默认就是s;当整数时:b,o,x和X是二进制、八进制、十六进制,c是数字按unicode转成字符,d是正常十进制,默认是d。也可以使用n来代替d。
>>> "{0:d},{0:b},{0:o},{0:x},{0:X}".format(10) '10,1010,12,a,A'
浮点数时:e和E是指数,f和F是浮点数。g和G是同一的,也可以使用n来代替g,%是显示百分比。
>>> "{0:e},{0:F},{0:g},{0:n},{0:%}".format(1.1) '1.100000e+00,1.100000,1.1,1.1,110.000000%'