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%'