微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python 的内置字符串方法小结

字符串处理是非常常用的技能,但 Python 内置字符串方法太多,常常遗忘,为了便于快速参考,特地依据 Python 3.5.1 给每个内置方法写了示例并进行了归类,便于大家索引。

PS: 可以点击概览内的绿色标题进入相应分类或者通过右侧边栏文章目录快速索引相应方法

大小写转换

str.capitalize()

将首字母转换成大写,需要注意的是如果首字没有大写形式,则返回原字符串。

'adi dog'.capitalize()
# 'Adi dog'

'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()

对字符串字母的大小写进行反转。

'徐dobi a123 ß'.swapcase()
#: '徐dobI A123 SS'    这里的 ß 被转成 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()

将字符串中每个“单词”首字母大写。其判断“单词”的依据则是基于空格和标点,所以应对英文撇好所有格或一些英文大写的简写时,会出错。

'Hello world'.title()
# 'Hello World'

'中文abc def 12gh'.title()
# '中文Abc Def 12Gh'

# 但这个方法并不完美:
"they're bill's friends from the UK".title()
# "They'Re Bill'S Friends From The Uk"

str.upper()

将字符串所有字母变为大写,会自动忽略不可转成大写的字符。

'中文abc def 12gh'.upper()
# '中文ABC DEF 12GH'
需要注意的是 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  456 7890    1112131415  161718192021'
# '12341234123412341234123412341234' 
str.format(^args,^^kwargs)

格式化字符串的语法比较繁多,官方文档已经有比较详细的 examples,这里就不写例子了,想了解的童鞋可以直接戳这里 Format examples.

str.format_map(mapping)

类似 str.format(*args,**kwargs) ,不同的是 mapping 是一个字典对象。

People = {'name':'john','age':56}

'My name is {name},i am {age} old'.format_map(People)
# 'My name is john,i am 56 old'

字符串搜索定位与替换

str.count(sub[,start[,end]])
text = 'outer protective covering'

text.count('e')
# 4

text.count('e',5,11)
# 1

text.count('e',10)
# 0
str.find(sub[,end]]); str.rfind(sub[,end]])
text = 'outer protective covering'

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',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[,end]]); str.rindex(sub[,end]])
与 find() rfind() 类似,不同的是如果找不到,就会引发 ValueError。

str.replace(old,new[,count])
'dog wow wow jiao'.replace('wow','wang')
# 'dog wang wang jiao'

'dog wow wow jiao'.replace('wow','wang',1)
# 'dog wang wow jiao'

'dog wow wow jiao'.replace('wow',0)
# 'dog wow wow jiao'

'dog wow wow jiao'.replace('wow',2)
# 'dog wang wang jiao'

'dog wow wow jiao'.replace('wow',3)
# 'dog wang wang jiao'
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'
static str.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)
# 'dobi is a狗狗'

如果 maktrans 有两个参数,则两个参数形成映射,且两个字符串必须是长度相等;如果有第三个参数,则第三个参数也必须是字符串,该字符串将自动映射到 None:

a = 'dobi is a dog'

table = str.maketrans('dobi','alph')

a.translate(table)
# 'alph hs a alg'

table = str.maketrans('dobi','alph','o')

a.translate(table)
# 'aph hs a ag'

字符串的联合与分割

str.join(iterable)

用指定的字符串,连接元素为字符串的可迭代对象。

'-'.join(['2012','3','12'])
# '2012-3-12'

'-'.join([2012,3,12])
# TypeError: sequence item 0: expected str instance,int found

'-'.join(['2012',b'12'])  #bytes 为非字符串
# TypeError: sequence item 2: expected str instance,bytes found

'-'.join(['2012'])
# '2012'

'-'.join([])
# ''

'-'.join([None])
# TypeError: sequence item 0: expected str instance,nonetype found

'-'.join([''])
# ''

','.join({'dobi':'dog','polly':'bird'})
# 'dobi,polly'

','polly':'bird'}.values())
# 'dog,bird'
str.partition(sep); str.rpartition(sep)
'dog wow wow jiao'.partition('wow')
# ('dog ','wow',' wow jiao')

'dog wow wow jiao'.partition('dog')
# ('','dog',' wow wow jiao')

'dog wow wow jiao'.partition('jiao')
# ('dog wow wow ','jiao','')

'dog wow wow jiao'.partition('ww')
# ('dog wow wow jiao','','')

'dog wow wow jiao'.rpartition('wow')
Out[131]: ('dog wow ',' jiao')

'dog wow wow jiao'.rpartition('dog')
Out[132]: ('',' wow wow jiao')

'dog wow wow jiao'.rpartition('jiao')
Out[133]: ('dog wow wow ','')

'dog wow wow jiao'.rpartition('ww')
Out[135]: ('','dog wow wow jiao')
str.split(sep=None,maxsplit=-1); str.rsplit(sep=None,maxsplit=-1)
'1,2,3'.split(','),'1,3'.rsplit()
# (['1','2','3'],['1,','2,'3'])

'1,maxsplit=1),  '1,3'.rsplit(',maxsplit=1)
# (['1',3'],2','3'])

'1 2 3'.split(),'1 2 3'.rsplit()
# (['1',['1','3'])

'1 2 3'.split(maxsplit=1),'1 2 3'.rsplit(maxsplit=1)
# (['1','2 3'],['1 2','3'])

'   1   2   3   '.split()
# ['1','3']

'1,'.split(','.rsplit(',')
# (['1',''],''])

''.split()
# []
''.split('a')
# ['']
'bcd'.split('a')
# ['bcd']
'bcd'.split(None)
# ['bcd']
str.splitlines([keepends])

字符串以行界符为分隔符拆分为列表;当 keepends 为True,拆分后保留行界符,能被识别的行界符见官方文档。

'ab c\n\nde fg\rkl\r\n'.splitlines()
# ['ab c','de fg','kl']
'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True)
# ['ab c\n','\n','de fg\r','kl\r\n']

"".splitlines(), ''.split('\n')      #注意两者的区别
# ([],[''])
"One line\n".splitlines()
# (['One line'],['Two lines',''])

字符串条件判断

str.endswith(suffix[,end]]); str.startswith(prefix[,end]])
text = 'outer protective covering'

text.endswith('ing')
# True

text.endswith(('gin','ing'))
# True
text.endswith('ter',5)
# True

text.endswith('ter',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

'dobi 123'.isalnum()
# False

'%'.isalnum()
# False
str.isalpha()
Unicode 字符数据库中作为 “Letter”(这些字符一般具有 “Lm”,“Lt”,“Lu”,“Ll”,or “Lo” 等标识,不同于 Alphabetic) 的,均为真。

'dobi'.isalpha()
# True

'do bi'.isalpha()
# False

'dobi123'.isalpha()
# False

'徐'.isalpha()
# True
str.isdecimal(); str.isdigit(); str.isnumeric()
三个方法的区别在于对 Unicode 通用标识的真值判断范围不同:

isdecimal: Nd,
isdigit: No,Nd,
isnumeric: No,Nl

digit 与 decimal 的区别在于有些数值字符串,是 digit 却非 decimal ,具体戳 这里

num = '\u2155'
print(num)
# ⅕
num.isdecimal(),num.isdigit(),num.isnumeric()
# (False,False,True)

num = '\u00B2'
print(num)
# ²
num.isdecimal(),True,True)

num = "1"  #unicode
num.isdecimal(),num.isnumeric()
# (Ture,True)

num = "'Ⅶ'"
num.isdecimal(),True)

num = "十"
num.isdecimal(),True)

num = b"1" # byte
num.isdigit()   # True
num.isdecimal() # AttributeError 'bytes' object has no attribute 'isdecimal'
num.isnumeric() # AttributeError 'bytes' object has no attribute 'isnumeric'
str.isidentifier()

判断字符串是否可为合法的标识符。

'def'.isidentifier()
# True

'with'.isidentifier()
# True

'false'.isidentifier()
# True

'dobi_123'.isidentifier()
# True

'dobi 123'.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

'dobi 123'.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()

判断字符串中的字符是否是首字母大写,其会忽视非字母字符。

'How Python Works'.istitle()
# True

'How Python WORKS'.istitle()
# False

'how python works'.istitle()
# False

'How Python  Works'.istitle()
# True

' '.istitle()
# False

''.istitle()
# False

'A'.istitle()
# True

'a'.istitle()
# False

'甩甩Abc Def 123'.istitle()
# True
str.isupper()
'徐'.isupper()
# False

'dobI'.isupper()
Out[41]: True

'dobi'.isupper()
# False

'dobI123'.isupper()
# True

'dobI 123'.isupper()
# True

'dobI\t 123'.isupper()
# True

'dobI_123'.isupper()
# True

'_123'.isupper()
# False

字符串编码

str.encode(encoding="utf-8",errors="strict")

fname = '徐'

fname.encode('ascii')
# UnicodeEncodeError: 'ascii' codec can't encode character '\u5f90'...

fname.encode('ascii','replace')
# b'?'

fname.encode('ascii','ignore')
# b''

fname.encode('ascii','xmlcharrefreplace')
# b'徐'

fname.encode('ascii','backslashreplace')
# b'\\u5f90'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用爬虫利器 Playwright,轻松爬取抖查查数据 我们先分析登录的接口,其中 url 有一些非业务参数:ts、he、sign、secret。 然后根据这些参数作为关键词,定位到相关的 js 代码。 最后,逐步进行代码的跟踪,发现大部分的代码被混淆加密了。 花费了大半天,来还原这些混淆加密的代码
轻松爬取灰豚数据的抖音商品数据 调用两次登录接口实现模拟登录 我们分析登录接口,发现调用了两次不同的接口;而且,需要先调用 https://login.huitun.com/weChat/userLogin,然后再调用 https://dyapi.huitun.com/userLogin 接口。 登
成功绕过阿里无痕验证码,一键爬取飞瓜数据 飞瓜数据的登录接口,接入了阿里云的无痕验证码;通过接口方式模拟登录,难度比较高。所以,我们使用自动化的方式来实现模拟登录,并且获取到 cookie 数据。 [阿里无痕验证码] https://help.aliyun.com/document_detail/1
一文教你从零开始入门蝉妈妈数据爬取,成功逆向破解数据加密算法 通过接口进行模拟登录 我们先通过正常登录的方式,分析对应的登录接口。通过 F12 打开谷歌浏览器的调试面板,可以看到登录需要传递的一些参数;其中看到密码是被加密了。 不过我们通过经验可以大概猜测一下,应该是通过 md5 算法加密了。 接下
抽丝剥茧成功破解红人点集的签名加密算法 抽丝剥茧破解登录签名算法,成功实现模拟登录 headers = {} phone_num = "xxxx" password = "xxxx" md5_hash = hashlib.md5() md5_hash.upda
轻松绕过 Graphql 接口爬取有米有数的商品数据 有米有数数据的 API 接口,使用的是一种 API 查询语言 graphql。所有的 API 只有一个入口,具体的操作隐藏在请求数据体里面传输。 模拟登录,获取 sessionId 调用登录接口,进行模拟登录。 cookies = {} head
我最近重新拾起了计算机视觉,借助Python的opencv还有face_recognition库写了个简单的图像识别demo,额外定制了一些内容,原本想打包成exe然后发给朋友,不过在这当中遇到了许多小问题,都解决了,记录一下踩过的坑。 1、Pyinstaller打包过程当中出现warning,跟d
说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Pooling在中文当中的意思是“池化”,在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体操作如下图: 结合图像理解,相信你也会大概明白其中的本意。不过Pooling并不是只可以选取2x2的窗口大小,即便是3x3,
记得大一学Python的时候,有一个题目是判断一个数是否是复数。当时觉得比较复杂不好写,就琢磨了一个偷懒的好办法,用异常处理的手段便可以大大程度帮助你简短代码(偷懒)。以下是判断整数和复数的两段小代码: 相信看到这里,你也有所顿悟,能拓展出更多有意思的方法~
文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic histogram2. 数据分布与密度信息显示 Control rug and density on seaborn histogram3. 带箱形图的直方图 Histogram with a boxplot on t