Python 的内置字符串方法(收藏专用)

4.7k 次阅读  ·  读完需要 44 分钟

5

字符串处理是非常常用的技能,但 Python 内置字符串方法太多,常常遗忘,为了便于快速参考,特地依据 Python 3.5.1 给每个内置方法写了示例并进行了归类,便于大家索引。
PS: 可以点击概览内的绿色标题进入相应分类或者通过右侧边栏文章目录快速索引相应方法。

概览

字符串大小写转换

  • str.capitalize()

  • str.lower()

  • str.casefold()

  • str.swapcase()

  • str.title()

  • str.upper()

字符串格式输出

  • str.center(width[, fillchar])

  • str.ljust(width[, fillchar]); str.rjust(width[, fillchar])

  • str.zfill(width)

  • str.expandtabs(tabsize=8)

  • str.format(^args, ^^kwargs)

  • str.format_map(mapping)

字符串搜索定位与替换

  • str.count(sub[, start[, end]])

  • str.find(sub[, start[, end]]); str.rfind(sub[, start[, end]])

  • str.index(sub[, start[, end]]); str.rindex(sub[, start[, end]])

  • str.replace(old, new[, count])

  • str.lstrip([chars]); str.rstrip([chars]); str.strip([chars])

  • static str.maketrans(x[, y[, z]]); str.translate(table)

字符串的联合与分割

  • str.join(iterable)

  • str.partition(sep); str.rpartition(sep)

  • str.split(sep=None, maxsplit=-1); str.rsplit(sep=None, maxsplit=-1)

  • str.splitlines([keepends])

字符串条件判断

  • str.endswith(suffix[, start[, end]]); str.startswith(prefix[, start[, end]])

  • str.isalnum()

  • str.isalpha()

  • str.isdecimal(); str.isdigit(); str.isnumeric()

  • str.isidentifier()

  • str.islower()

  • str.isprintable()

  • str.isspace()

  • str.istitle()

  • str.isupper()

字符串编码

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

大小写转换

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', 5, 10)
# 0

str.find(sub[, start[, end]]); str.rfind(sub[, start[, 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', 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])

'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', 'wang', 0)
# 'dog wow wow jiao' 'dog wow wow jiao'.replace('wow', 'wang', 2)
# 'dog wang wang jiao' 'dog wow wow jiao'.replace('wow', 'wang', 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', '3', 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' ','.join({'dobi':'dog', '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 ', 'wow', ' jiao') 'dog wow wow jiao'.rpartition('dog')
Out[132]: ('', 'dog', ' wow wow jiao') 'dog wow wow jiao'.rpartition('jiao')
Out[133]: ('dog wow wow ', 'jiao', '') '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, 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']) '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']) ' 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,拆分后保留行界符,能被识别的行界符见官方文档

'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[, start[, end]]); str.startswith(prefix[, start[, end]])

text = 'outer protective covering'

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

参考资料

Python 内置类型字符串方法

Python 的内置字符串方法(收藏专用)的更多相关文章

  1. Python3内置字符串方法详解

    官网文档地址:https://docs.python.org/3/library/stdtypes.html#string-methods基于 Python 3.X 版本 str.capitalize ...

  2. python数据类型内置的方法

    数据类型的内置方法 在日常生活中不同类型的数据具有不同的功能 eg:表格数据文件具有处理表格的各项功能(透视表 图形化 公式计算) 视频数据文件具有快进 加速等各项功能 ... 1.整型int # 方 ...

  3. Python:内置split()方法

    描述 Python split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串 语法 split()方法语法: str.split(str="&qu ...

  4. python 字典内置方法get应用

    python字典内置方法get应用,如果我们需要获取字典值的话,我们有两种方法,一个是通过dict['key'],另外一个就是dict.get()方法. 今天给大家分享的就是字典的get()方法. 这 ...

  5. Python的内置方法,abs,all,any,basestring,bin,bool,bytearray,callable,chr,cmp,complex,divmod

    Python的内置方法 abs(X):返回一个数的绝对值,X可以是一个整数,长整型,或者浮点数,如果X是一个复数,此方法返回此复数的绝对值(此复数与它的共轭复数的乘积的平方根) >>> ...

  6. Python字典内置函数和方法

    Python字典内置函数和方法: 注:使用了 items.values.keys 返回的是可迭代对象,可以使用 list 转化为列表. len(字典名): 返回键的个数,即字典的长度 # len(字典 ...

  7. python - 类的内置 attr 方法

    类的内置 attr 方法 #类的内置 attr 方法: # __getattr__ # __setattr__ # __delattr__ # __getattr__ #到调用一个类不存在数参数时,将 ...

  8. python基础-内置函数详解

    一.内置函数(python3.x) 内置参数详解官方文档: https://docs.python.org/3/library/functions.html?highlight=built#ascii ...

  9. python_way,day3 集合、函数、三元运算、lambda、python的内置函数、字符转换、文件处理

    python_way,day3 一.集合 二.函数 三.三元运算 四.lambda 五.python的内置函数 六.字符转换 七.文件处理 一.集合: 1.集合的特性: 特性:无序,不重复的序列 如果 ...

随机推荐

  1. springboot注入的四个注解

    java配置主要靠java类和一些注解来达到和xml配置一样的效果,比较常用的注解有: @Configuration:声明一个类作为配置类,代替xml文件@Bean:声明在方法上,将方法的返回值加入B ...

  2. liunx mysql数据库目录迁移

    1.查看mysql安装目录 从目录etc/my.cnf中查看安装目录 2.进入mysql目录,停止mysql服务 命令: cd usr/local/mysql 命令:service mysql sto ...

  3. PB 奇葩BUG

    1. 在数据窗口的Edit 中选则CHeckBox 后,必须给默认值,否则会导致数据保存不了,也无提示. 2.当使用数据窗口的 setfile()函数时 如果 条件中有两个LIKE 则会报错,一个LI ...

  4. Luogu3214 HNOI2011 卡农 组合、DP

    传送门 火题qwq 我们需要求的是满足元素个数为\(M\).元素取值范围为\([1,2^n-1]\).元素异或和为\(0\)的集合的数量. 首先我们可以计算元素有序的方案数(即计算满足这些条件的序列的 ...

  5. Bootstraps 4 引入报错 Error: Bootstrap tooltips require Tether

    问题: 解决办法 (http://github.hubspot.com/tether/) Bootstrap 4 needs Tether, so you need to include tether ...

  6. Java 常用API (第二部分)

    常用api第二部分 Date 类 import java.util.Date; 时间原点: 1970-01-01 00:00:00(英国格林威治) 中国属于东八区, 会把时间增加 8 个小时: 197 ...

  7. 仿EXCEL插件,智表ZCELL产品V1.6 版本发布,增加自定义事件功能

    详细请移步 智表(ZCELL)官网www.zcell.net 更新说明  这次更新主要应用户要求,主要解决了单元格值变化时事件的支持,并新增了按单元格名操作的相关API,欢迎大家体验使用. 本次版本更 ...

  8. php ajax生成excel并下载

    目标:使用php,通过ajax请求的方式生成一个excel,然后下载. 思路:大致思路是发送一个ajax请求到后台,后台php处理后生成一个excel文件,然后把生成的文件放到一个临时目录,然后把文件 ...

  9. 代替for-in 遍历对象

    object.keys() object.getOwnPropertyName()

  10. ECharts 散点图+百度地图(案例转载)

    转载来源:https://efe.baidu.com/blog/echarts-map-tutorial-2/ ECharts 实现地图散点图(下)  小红  2016-06-13  ECharts, ...