Python 的内置字符串方法小结
字符串处理是非常常用的技能,但Python内置字符串方法太多,常常遗忘,为了便于快速参考,特地依据Python3.5.1给每个内置方法写了示例并进行了归类,便于大家索引。
PS:可以点击概览内的绿色标题进入相应分类或者通过右侧边栏文章目录快速索引相应方法。
大小写转换
str.capitalize()
将首字母转换成大写,需要注意的是如果首字没有大写形式,则返回原字符串。
'adidog'.capitalize()
#'Adidog'
'abcd徐'.capitalize()
#'Abcd徐'
'徐abcd'.capitalize()
#'徐abcd'
'ß'.capitalize()
#'SS'
str.lower()
将字符串转换成小写,其仅对ASCII编码的字母有效。
'DOBI'.lower()
#'dobi'
'ß'.lower() #'ß'为德语小写字母,其有另一种小写'ss',lower方法无法转换
#'ß'
'徐ABCD'.lower()
#'徐abcd'
str.casefold()
将字符串转换成小写,Unicode编码中凡是有对应的小写形式的,都会转换。
'DOBI'.casefold()
#'dobi'
'ß'.casefold() #德语中小写字母ß等同于小写字母ss,其大写为SS
#'ss'
str.swapcase()
对字符串字母的大小写进行反转。
'徐Dobia123ß'.swapcase()
#:'徐dOBIA123SS' 这里的ß被转成SS是一种大写
但需要注意的是s.swapcase().swapcase()==s不一定为真:
u'\xb5'
#'µ'
u'\xb5'.swapcase()
#'Μ'
u'\xb5'.swapcase().swapcase()
#'μ'
hex(ord(u'\xb5'.swapcase().swapcase()))
Out[154]:'0x3bc'
这里'Μ'(是mu不是M)的小写正好与'μ'的写法一致。
str.title()
将字符串中每个“单词”首字母大写。其判断“单词”的依据则是基于空格和标点,所以应对英文撇好所有格或一些英文大写的简写时,会出错。
'Helloworld'.title()
#'HelloWorld'
'中文abcdef12gh'.title()
#'中文AbcDef12Gh'
#但这个方法并不完美:
"they'rebill'sfriendsfromtheUK".title()
#"They'ReBill'SFriendsFromTheUk"
str.upper()
将字符串所有字母变为大写,会自动忽略不可转成大写的字符。
'中文abcdef12gh'.upper()
#'中文ABCDEF12GH'
需要注意的是s.upper().isupper()不一定为True。
字符串格式输出
str.center(width[,fillchar])
将字符串按照给定的宽度居中显示,可以给定特定的字符填充多余的长度,如果指定的长度小于字符串长度,则返回原字符串。
'12345'.center(10,'*')
#'**12345***'
'12345'.center(10)
#' 12345 '
str.ljust(width[,fillchar]);str.rjust(width[,fillchar])
返回指定长度的字符串,字符串内容居左(右)如果长度小于字符串长度,则返回原始字符串,默认填充为ASCII空格,可指定填充的字符串。
'dobi'.ljust(10)
#'dobi '
'dobi'.ljust(10,'~')
#'dobi~~~~~~'
'dobi'.ljust(3,'~')
#'dobi'
'dobi'.ljust(3)
#'dobi'
str.zfill(width)
用'0'填充字符串,并返回指定宽度的字符串。
"42".zfill(5)
#'00042'
"-42".zfill(5)
#'-0042'
'dd'.zfill(5)
#'000dd'
'--'.zfill(5)
#'-000-'
''.zfill(5)
#'0000'
''.zfill(5)
#'00000'
'dddddddd'.zfill(5)
#'dddddddd'
str.expandtabs(tabsize=8)
用指定的空格替代横向制表符,使得相邻字符串之间的间距保持在指定的空格数以内。
tab='1\t23\t456\t7890\t1112131415\t161718192021'
tab.expandtabs()
#'1 23 456 7890 1112131415 161718192021'
#'123456781234567812345678123456781234567812345678' 注意空格的计数与上面输出位置的关系
tab.expandtabs(4)
#'1 23 4567890 1112131415 161718192021'
#'12341234123412341234123412341234'
str.format(^args,^^kwargs)
格式化字符串的语法比较繁多,官方文档已经有比较详细的examples,这里就不写例子了,想了解的童鞋可以直接戳这里Formatexamples.
str.format_map(mapping)
类似str.format(*args,**kwargs),不同的是mapping是一个字典对象。
People={'name':'john','age':56}
'Mynameis{name},iam{age}old'.format_map(People)
#'Mynameisjohn,iam56old'
字符串搜索定位与替换
str.count(sub[,start[,end]])
text='outerprotectivecovering'
text.count('e')
#4
text.count('e',5,11)
#1
text.count('e',5,10)
#0
str.find(sub[,start[,end]]);str.rfind(sub[,start[,end]])
text='outerprotectivecovering'
text.find('er')
#3
text.find('to')
#-1
text.find('er',3)
Out[121]:3
text.find('er',4)
Out[122]:20
text.find('er',4,21)
Out[123]:-1
text.find('er',4,22)
Out[124]:20
text.rfind('er')
Out[125]:20
text.rfind('er',20)
Out[126]:20
text.rfind('er',20,21)
Out[129]:-1
str.index(sub[,start[,end]]);str.rindex(sub[,start[,end]])
与find()rfind()类似,不同的是如果找不到,就会引发ValueError。
str.replace(old,new[,count])
'dogwowwowjiao'.replace('wow','wang')
#'dogwangwangjiao'
'dogwowwowjiao'.replace('wow','wang',1)
#'dogwangwowjiao'
'dogwowwowjiao'.replace('wow','wang',0)
#'dogwowwowjiao'
'dogwowwowjiao'.replace('wow','wang',2)
#'dogwangwangjiao'
'dogwowwowjiao'.replace('wow','wang',3)
#'dogwangwangjiao'
str.lstrip([chars]);str.rstrip([chars]);str.strip([chars])
' dobi'.lstrip()
#'dobi'
'db.kun.ac.cn'.lstrip('dbk')
#'.kun.ac.cn'
'dobi '.rstrip()
#'dobi'
'db.kun.ac.cn'.rstrip('acn')
#'db.kun.ac.'
' dobi '.strip()
#'dobi'
'db.kun.ac.cn'.strip('db.c')
#'kun.ac.cn'
'db.kun.ac.cn'.strip('cbd.un')
#'kun.a'
staticstr.maketrans(x[,y[,z]]);str.translate(table)
maktrans是一个静态方法,用于生成一个对照表,以供translate使用。
如果maktrans仅一个参数,则该参数必须是一个字典,字典的key要么是一个Unicode编码(一个整数),要么是一个长度为1的字符串,字典的value则可以是任意字符串、None或者Unicode编码。
a='dobi'
ord('o')
#111
ord('a')
#97
hex(ord('狗'))
#'0x72d7'
b={'d':'dobi',111:'is','b':97,'i':'\u72d7\u72d7'}
table=str.maketrans(b)
a.translate(table)
#'dobiisa狗狗'
如果maktrans有两个参数,则两个参数形成映射,且两个字符串必须是长度相等;如果有第三个参数,则第三个参数也必须是字符串,该字符串将自动映射到None:
a='dobiisadog'
table=str.maketrans('dobi','alph')
a.translate(table)
#'alphhsaalg'
table=str.maketrans('dobi','alph','o')
a.translate(table)
#'aphhsaag'
字符串的联合与分割
str.join(iterable)
用指定的字符串,连接元素为字符串的可迭代对象。
'-'.join(['2012','3','12'])
#'2012-3-12'
'-'.join([2012,3,12])
#TypeError:sequenceitem0:expectedstrinstance,intfound
'-'.join(['2012','3',b'12']) #bytes为非字符串
#TypeError:sequenceitem2:expectedstrinstance,bytesfound
'-'.join(['2012'])
#'2012'
'-'.join([])
#''
'-'.join([None])
#TypeError:sequenceitem0:expectedstrinstance,NoneTypefound
'-'.join([''])
#''
','.join({'dobi':'dog','polly':'bird'})
#'dobi,polly'
','.join({'dobi':'dog','polly':'bird'}.values())
#'dog,bird'
str.partition(sep);str.rpartition(sep)
'dogwowwowjiao'.partition('wow')
#('dog','wow','wowjiao')
'dogwowwowjiao'.partition('dog')
#('','dog','wowwowjiao')
'dogwowwowjiao'.partition('jiao')
#('dogwowwow','jiao','')
'dogwowwowjiao'.partition('ww')
#('dogwowwowjiao','','')
'dogwowwowjiao'.rpartition('wow')
Out[131]:('dogwow','wow','jiao')
'dogwowwowjiao'.rpartition('dog')
Out[132]:('','dog','wowwowjiao')
'dogwowwowjiao'.rpartition('jiao')
Out[133]:('dogwowwow','jiao','')
'dogwowwowjiao'.rpartition('ww')
Out[135]:('','','dogwowwowjiao')
str.split(sep=None,maxsplit=-1);str.rsplit(sep=None,maxsplit=-1)
'1,2,3'.split(','),'1,2,3'.rsplit()
#(['1','2','3'],['1,','2,','3'])
'1,2,3'.split(',',maxsplit=1), '1,2,3'.rsplit(',',maxsplit=1)
#(['1','2,3'],['1,2','3'])
'123'.split(),'123'.rsplit()
#(['1','2','3'],['1','2','3'])
'123'.split(maxsplit=1),'123'.rsplit(maxsplit=1)
#(['1','23'],['12','3'])
' 1 2 3 '.split()
#['1','2','3']
'1,2,,3,'.split(','),'1,2,,3,'.rsplit(',')
#(['1','2','','3',''],['1','2','','3',''])
''.split()
#[]
''.split('a')
#['']
'bcd'.split('a')
#['bcd']
'bcd'.split(None)
#['bcd']
str.splitlines([keepends])
字符串以行界符为分隔符拆分为列表;当keepends为True,拆分后保留行界符,能被识别的行界符见官方文档。
'abc\n\ndefg\rkl\r\n'.splitlines()
#['abc','','defg','kl']
'abc\n\ndefg\rkl\r\n'.splitlines(keepends=True)
#['abc\n','\n','defg\r','kl\r\n']
"".splitlines(),''.split('\n') #注意两者的区别
#([],[''])
"Oneline\n".splitlines()
#(['Oneline'],['Twolines',''])
字符串条件判断
str.endswith(suffix[,start[,end]]);str.startswith(prefix[,start[,end]])
text='outerprotectivecovering'
text.endswith('ing')
#True
text.endswith(('gin','ing'))
#True
text.endswith('ter',2,5)
#True
text.endswith('ter',2,4)
#False
str.isalnum()
字符串和数字的任意组合,即为真,简而言之:
只要c.isalpha(),c.isdecimal(),c.isdigit(),c.isnumeric()中任意一个为真,则c.isalnum()为真。
'dobi'.isalnum()
#True
'dobi123'.isalnum()
#True
'123'.isalnum()
#True
'徐'.isalnum()
#True
'dobi_123'.isalnum()
#False
'dobi123'.isalnum()
#False
'%'.isalnum()
#False
str.isalpha()
Unicode字符数据库中作为“Letter”(这些字符一般具有“Lm”,“Lt”,“Lu”,“Ll”,or“Lo”等标识,不同于Alphabetic)的,均为真。
'dobi'.isalpha()
#True
'dobi'.isalpha()
#False
'dobi123'.isalpha()
#False
'徐'.isalpha()
#True
str.isdecimal();str.isdigit();str.isnumeric()
三个方法的区别在于对Unicode通用标识的真值判断范围不同:
isdecimal:Nd,
isdigit:No,Nd,
isnumeric:No,Nd,Nl
digit与decimal的区别在于有些数值字符串,是digit却非decimal,具体戳这里
num='\u2155'
print(num)
#⅕
num.isdecimal(),num.isdigit(),num.isnumeric()
#(False,False,True)
num='\u00B2'
print(num)
#²
num.isdecimal(),num.isdigit(),num.isnumeric()
#(False,True,True)
num="1" #unicode
num.isdecimal(),num.isdigit(),num.isnumeric()
#(Ture,True,True)
num="'Ⅶ'"
num.isdecimal(),num.isdigit(),num.isnumeric()
#(False,False,True)
num="十"
num.isdecimal(),num.isdigit(),num.isnumeric()
#(False,False,True)
num=b"1"#byte
num.isdigit() #True
num.isdecimal()#AttributeError'bytes'objecthasnoattribute'isdecimal'
num.isnumeric()#AttributeError'bytes'objecthasnoattribute'isnumeric'
str.isidentifier()
判断字符串是否可为合法的标识符。
'def'.isidentifier()
#True
'with'.isidentifier()
#True
'false'.isidentifier()
#True
'dobi_123'.isidentifier()
#True
'dobi123'.isidentifier()
#False
'123'.isidentifier()
#False
str.islower()
'徐'.islower()
#False
'ß'.islower() #德语大写字母
#False
'a徐'.islower()
#True
'ss'.islower()
#True
'23'.islower()
#False
'Ab'.islower()
#False
str.isprintable()
判断字符串的所有字符都是可打印字符或字符串为空。Unicode字符集中“Other”“Separator”类别的字符为不可打印的字符(但不包括ASCII的空格(0x20))。
'dobi123'.isprintable()
#True
'dobi123\n'.isprintable()
Out[24]:False
'dobi123'.isprintable()
#True
'dobi.123'.isprintable()
#True
''.isprintable()
#True
str.isspace()
判断字符串中是否至少有一个字符,并且所有字符都是空白字符。
In[29]:'\r\n\t'.isspace()
Out[29]:True
In[30]:''.isspace()
Out[30]:False
In[31]:''.isspace()
Out[31]:True
str.istitle()
判断字符串中的字符是否是首字母大写,其会忽视非字母字符。
'HowPythonWorks'.istitle()
#True
'HowPythonWORKS'.istitle()
#False
'howpythonworks'.istitle()
#False
'HowPython Works'.istitle()
#True
''.istitle()
#False
''.istitle()
#False
'A'.istitle()
#True
'a'.istitle()
#False
'甩甩AbcDef123'.istitle()
#True
str.isupper()
'徐'.isupper()
#False
'DOBI'.isupper()
Out[41]:True
'Dobi'.isupper()
#False
'DOBI123'.isupper()
#True
'DOBI123'.isupper()
#True
'DOBI\t123'.isupper()
#True
'DOBI_123'.isupper()
#True
'_123'.isupper()
#False
字符串编码
str.encode(encoding="utf-8",errors="strict")
fname='徐'
fname.encode('ascii')
#UnicodeEncodeError:'ascii'codeccan'tencodecharacter'\u5f90'...
fname.encode('ascii','replace')
#b'?'
fname.encode('ascii','ignore')
#b''
fname.encode('ascii','xmlcharrefreplace')
#b'徐'
fname.encode('ascii','backslashreplace')
#b'\\u5f90'