python中字符串的操作方法大全


Posted in Python onJune 03, 2018

前言

python中字符串对象提供了很多方法来操作字符串,功能相当丰富。

print(dir(str))

[..........'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

这些方法的使用说明见官方文档:string methods,本文对它们进行详细解释,各位以后可将本文当作手册。

这里没有模式匹配(正则)相关的功能。python中要使用模式匹配相关的方法操作字符串,需要import re导入re模块。关于正则模式匹配,参见:re Module Contents。

注意,python中字符串是不可变对象,所以所有修改和生成字符串的操作的实现方法都是另一个内存片段中新生成一个字符串对象。例如,'abc'.upper()将会在划分另一个内存片段,并将返回的ABC保存在此内存中。

下文出现的"S"表示待操作的字符串。本文没有对casefold,encode,format,format_map进行介绍,前两者和unicode有关,后两者内容有点太多。

1.大小写转换

1.1 lower、upper

S.lower()
S.upper()

返回S字符串的小写、大写格式。(注意,这是新生成的字符串,在另一片内存片段中,后文将不再解释这种行为)

例如:

>>> print('ab XY'.lower())
ab xy
>>> print('ab XY'.upper())
AB XY

1.2 title、capitalize

S.title()
S.capitalize()

前者返回S字符串中所有单词首字母大写且其他字母小写的格式,后者返回首字母大写、其他字母全部小写的新字符串。

例如:

>>> print('ab XY'.title())
Ab Xy
>>> print('abc DE'.capitalize())
Abc de

1.3 swapcase

S.swapcase()

swapcase()对S中的所有字符串做大小写转换(大写-->小写,小写-->大写)。

>>> print('abc XYZ'.swapcase())
ABC xyz

2.isXXX判断

2.1 isalpha,isdecimal,isdigit,isnumeric,isalnum

S.isdecimal()
S.isdigit()
S.isnumeric()
S.isalpha()
S.isalnum()

测试字符串S是否是数字、字母、字母或数字。对于非Unicode字符串,前3个方法是等价的。

例如:

>>> print('34'.isdigit())
True
>>> print('abc'.isalpha())
True
>>> print('a34'.isalnum())
True

2.2 islower,isupper,istitle

S.islower()
S.isupper()
S.istitle()

判断是否小写、大写、首字母大写。要求S中至少要包含一个字符串字符,否则直接返回False。例如不能是纯数字。
注意,istitle()判断时会对每个单词的首字母边界判断。例如,word1 Word2、word1_Word2、word1()Word2中都包含两个单词,它们的首字母都是"w"和"W"。因此,如果用istitle()去判断它们,将返回False,因为w是小写。

例如:

>>> print('a34'.islower())
True
>>> print('AB'.isupper())
True
>>> print('Aa'.isupper())
False
>>> print('Aa Bc'.istitle())
True
>>> print('Aa_Bc'.istitle())
True
>>> print('Aa bc'.istitle())
False
>>> print('Aa_bc'.istitle())
False

# 下面的返回False,因为非首字母C不是小写
>>> print('Aa BC'.istitle())
False

2.3 isspace,isprintable,isidentifier

S.isspace()
S.isprintable()
S.isidentifier()

分别判断字符串是否是空白(空格、制表符、换行符等)字符、是否是可打印字符(例如制表符、换行符就不是可打印字符,但空格是)、是否满足标识符定义规则。

例如:

判断是否为空白。没有任何字符是不算是空白。

>>> print(' '.isspace())
True
>>> print(' \t'.isspace())
True
>>> print('\n'.isspace())
True
>>> print(''.isspace())
False
>>> print('Aa BC'.isspace())
False

判断是否是可打印字符。

>>> print('\n'.isprintable())
False
>>> print('\t'.isprintable())
False
>>> print('acd'.isprintable())
True
>>> print(' '.isprintable())
True
>>> print(''.isprintable())
True

判断是否满足标识符定义规则。

标识符定义规则为:只能是字母或下划线开头、不能包含除数字、字母和下划线以外的任意字符。

>>> print('abc'.isidentifier())
True
>>> print('2abc'.isidentifier())
False
>>> print('abc2'.isidentifier())
True
>>> print('_abc2'.isidentifier())
True
>>> print('_abc_2'.isidentifier())
True
>>> print('_Abc_2'.isidentifier())
True
>>> print('Abc_2'.isidentifier())
True

3.填充

3.1 center

S.center(width[, fillchar])

将字符串居中,左右两边使用fillchar进行填充,使得整个字符串的长度为width。fillchar默认为空格。如果width小于字符串的长度,则无法填充直接返回字符串本身(不会创建新字符串对象)。

例如:

使用下划线填充并居中字符串

>>> print('ab'.center(4,'_'))
_ab_
>>> print('ab'.center(5,'_'))
__ab_

使用默认的空格填充并居中字符串

>>> print('ab'.center(4))
 ab 
>>> print(len('ab'.center(4)))
4

width小于字符串长度

>>> print('abcde'.center(3))
abcde

3.2 ljust和rjust

S.ljust(width[, fillchar])
S.rjust(width[, fillchar])

ljust()使用fillchar填充在字符串S的右边,使得整体长度为width。rjust()则是填充在左边。如果不指定fillchar,则默认使用空格填充。

如果width小于或等于字符串S的长度,则无法填充,直接返回字符串S(不会创建新字符串对象)。

例如:

>>> print('xyz'.ljust(5,'_'))
xyz__
>>> print('xyz'.rjust(5,'_'))
__xyz

3.3 zfill

S.zfill(width)

用0填充在字符串S的左边使其长度为width。如果S前右正负号+/-,则0填充在这两个符号的后面,且符号也算入长度。
如果width小于或等于S的长度,则无法填充,直接返回S本身(不会创建新字符串对象)。

>>> print('abc'.zfill(5))
00abc

>>> print('-abc'.zfill(5))
-0abc

>>> print('+abc'.zfill(5))
+0abc

>>> print('42'.zfill(5))
00042

>>> print('-42'.zfill(5))
-0042

>>> print('+42'.zfill(5))
+0042

4.子串搜索

4.1 count

S.count(sub[, start[, end]])

返回字符串S中子串sub出现的次数,可以指定从哪里开始计算(start)以及计算到哪里结束(end),索引从0开始计算,不包括end边界。

例如:

>>> print('xyabxyxy'.count('xy'))
3

# 次数2,因为从index=1算起,即从'y'开始查找,查找的范围为'yabxyxy'
>>> print('xyabxyxy'.count('xy',1))
2

# 次数1,因为不包括end,所以查找的范围为'yabxyx'
>>> print('xyabxyxy'.count('xy',1,7))
1

# 次数2,因为查找的范围为'yabxyxy'
>>> print('xyabxyxy'.count('xy',1,8))
2

4.2 endswith和startswith

S.endswith(suffix[, start[, end]])
S.startswith(prefix[, start[, end]])

endswith()检查字符串S是否已suffix结尾,返回布尔值的True和False。suffix可以是一个元组(tuple)。可以指定起始start和结尾end的搜索边界。

同理startswith()用来判断字符串S是否是以prefix开头。

例如:

suffix是普通的字符串时。

>>> print('abcxyz'.endswith('xyz'))
True
 
# False,因为搜索范围为'yz'
>>> print('abcxyz'.endswith('xyz',4))
False
 
# False,因为搜索范围为'abcxy'
>>> print('abcxyz'.endswith('xyz',0,5))
False
>>> print('abcxyz'.endswith('xyz',0,6))
True

suffix是元组(tuple)时,只要tuple中任意一个元素满足endswith的条件,就返回True。

# tuple中的'xyz'满足条件
>>> print('abcxyz'.endswith(('ab','xyz')))
True
 
# tuple中'ab'和'xy'都不满足条件
>>> print('abcxyz'.endswith(('ab','xy')))
False
 
# tuple中的'z'满足条件
>>> print('abcxyz'.endswith(('ab','xy','z')))
True

4.3 find,rfind和index,rindex

S.find(sub[, start[, end]])
S.rfind(sub[, start[, end]])¶
S.index(sub[, start[, end]])
S.rindex(sub[, start[, end]])

find()搜索字符串S中是否包含子串sub,如果包含,则返回sub的索引位置,否则返回"-1"。可以指定起始start和结束end的搜索位置。

index()和find()一样,唯一不同点在于当找不到子串时,抛出ValueError错误。

rfind()则是返回搜索到的最右边子串的位置,如果只搜索到一个或没有搜索到子串,则和find()是等价的。

同理rindex()。

例如:

>>> print('abcxyzXY'.find('xy'))
3
>>> print('abcxyzXY'.find('Xy'))
-1
>>> print('abcxyzXY'.find('xy',4))
-1

>>> print('xyzabcabc'.find('bc'))
4
>>> print('xyzabcabc'.rfind('bc'))
7

>>> print('xyzabcabc'.rindex('bcd'))
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
ValueError: substring not found

可以使用in操作符来判断字符串S是否包含子串sub,它返回的不是索引位置,而是布尔值。

>>> 'xy' in 'abxycd'
True
>>> 'xyz' in 'abxycd'
False

5.替换

5.1 replace

S.replace(old, new[, count])

将字符串中的子串old替换为new字符串,如果给定count,则表示只替换前count个old子串。如果S中搜索不到子串old,则无法替换,直接返回字符串S(不创建新字符串对象)。

>>> print('abcxyzoxy'.replace('xy','XY'))
abcXYzoXY
>>> print('abcxyzoxy'.replace('xy','XY',1))
abcXYzoxy
>>> print('abcxyzoxy'.replace('mn','XY',1))
abcxyzoxy

5.2 expandtabs

S.expandtabs(N)

将字符串S中的\t替换为一定数量的空格。默认N=8。

注意,expandtabs(8)不是将\t直接替换为8个空格。例如'xyz\tab'.expandtabs()会将\t替换为5个空格,因为"xyz"占用了3个字符位。

另外,它不会替换换行符(\n或\r)时。

例如:

>>> '01\t012\t0123\t01234'.expandtabs(4)
'01 012 0123 01234'

>>> '01\t012\t0123\t01234'.expandtabs(8)
'01  012  0123 01234'

>>> '01\t012\t0123\t01234'.expandtabs(7)
'01  012 0123 01234'

>>> print('012\t0123\n01234'.expandtabs(7))
012 0123
01234

5.3 translate和maketrans

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

str.maketrans()生成一个字符一 一映射的table,然后使用translate(table)对字符串S中的每个字符进行映射。

如果你熟悉Linux,就知道tr命令,translate()实现的功能和tr是类似的。

例如,现在想要对"I love fairy"做一个简单的加密,将里面部分字符都替换为数字,这样别人就不知道转换后的这句话是什么意思。

>>> in_str='abcxyz'
>>> out_str='123456'

# maketrans()生成映射表
>>> map_table=str.maketrans(in_str,out_str)

# 使用translate()进行映射
>>> my_love='I love fairy'
>>> result=my_love.translate(map_table)
>>> print(result)
I love f1ir5

注意,maketrans(x[, y[, z]])中的x和y都是字符串,且长度必须相等。

如果maketrans(x[, y[, z]])给定了第三个参数z,这这个参数字符串中的每个字符都会被映射为None。

例如,不替换"o"和"y"。

>>> in_str='abcxyz'
>>> out_str='123456'
>>> map_table=str.maketrans(in_str,out_str,'ay')
>>> my_love='I love fairy'
>>> result=my_love.translate(map_table)
>>> print(result)
I love fir

6.分割

6.1 partition和rpartition

S.partition(sep)
S.rpartition(sep)

搜索字符串S中的子串sep,并从sep处对S进行分割,最后返回一个包含3元素的元组:sep左边的部分是元组的第一个元素,sep自身是元组的二个元素,sep右边是元组的第三个元素。

partition(sep)从左边第一个sep进行分割,rpartition(sep)从右边第一个sep进行分割。

如果搜索不到sep,则返回的3元素元组中,有两个元素为空。partition()是后两个元素为空,rpartition()是前两个元素为空。

例如:

# 只搜索到一个sep时,两者结果相同
>>> print('abcxyzopq'.partition('xy'))
('abc', 'xy', 'zopq')
>>> print('abcxyzopq'.rpartition('xy'))
('abc', 'xy', 'zopq')

# 搜索到多个sep时,分别从左第一个、右第一个sep分割
>>> print('abcxyzxyopq'.partition('xy'))
('abc', 'xy', 'zxyopq')
>>> print('abcxyzxyopq'.rpartition('xy'))
('abcxyz', 'xy', 'opq')

# 搜索不到sep
>>> print('abcxyzxyopq'.partition('xyc'))
('abcxyzxyopq', '', '')
>>> print('abcxyzxyopq'.rpartition('xyc'))
('', '', 'abcxyzxyopq')

6.2 split、rsplit和splitlines

S.split(sep=None, maxsplit=-1)
S.rsplit(sep=None, maxsplit=-1)
S.splitlines([keepends=True])

都是用来分割字符串,并生成一个列表。

split()根据sep对S进行分割,maxsplit用于指定分割次数,如果不指定maxsplit或者给定值为"-1",则会从做向右搜索并且每遇到sep一次就分割直到搜索完字符串。如果不指定sep或者指定为None,则改变分割算法:以空格为分隔符,且将连续的空白压缩为一个空格。

rsplit()和split()是一样的,只不过是从右边向左边搜索。

splitlines()用来专门用来分割换行符。虽然它有点像split('\n')或split('\r\n'),但它们有些区别,见下文解释。

首先是split()的示例分析(rsplit()示例略)。

# sep为单个字符时
>>> '1,2,3'.split(',')
['1', '2', '3']

>>> '1,2,3'.split(',',1)
['1', '2,3']  # 只分割了一次

>>> '1,2,,3'.split(',')
['1', '2', '', '3'] # 不会压缩连续的分隔符

>>> '<hello><><world>'.split('<')
['', 'hello>', '>', 'world>']

# sep为多个字符时
>>> '<hello><><world>'.split('<>')
['<hello>', '<world>']

# 不指定sep时
>>> '1 2 3'.split()
['1', '2', '3']

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

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

>>> '  1  2  3 \n'.split()
['1', '2', '3']

# 显式指定sep为空格、制表符、换行符时
>>> ' 1 2 3 \n'.split(' ')
['', '1', '', '2', '', '3', '', '\n']

>>> ' 1 2 3 \n'.split('\t')
[' 1 2 3 \n']

>>> ' 1 2\n3 \n'.split('\n')
[' 1 2', '3 ', ''] # 注意列表的最后一项''

>>> ''.split('\n')
['']

再是splitlines()的示例分析。

splitlines()中可以指定各种换行符,常见的是\n、\r、\r\n。如果指定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']

将split()和splitlines()相比较一下:

#### split()
>>> ''.split('\n')
['']      # 因为没换行符可分割

>>> 'One line\n'.split('\n')
['One line', '']

#### splitlines()
>>> "".splitlines()
[]       # 因为没有换行符可分割

>>> 'Two lines\n'.splitlines()
['Two lines']

7.join

S.join(iterable)

将可迭代对象(iterable)中的字符串使用S连接起来。注意,iterable中必须全部是字符串类型,否则报错。

如果你还是python的初学者,还不知道iterable是什么,却想来看看join的具体语法,那么你可以暂时将它理解为:字符串string、列表list、元组tuple、字典dict、集合set。

例如:

字符串

>>> L='python'
>>> '_'.join(L)
'p_y_t_h_o_n'

元组

>>> L1=('1','2','3')
>>> '_'.join(L1)
'1_2_3'

集合。注意,集合无序。

>>> L2={'p','y','t','h','o','n'}
>>> '_'.join(L2)
'n_o_p_h_y_t'

列表

>>> L2=['py','th','o','n']
>>> '_'.join(L2)
'py_th_o_n'

字典

>>> L3={'name':"malongshuai",'gender':'male','from':'China','age':18}
>>> '_'.join(L3)
'name_gender_from_age'

iterable参与迭代的部分必须是字符串类型,不能包含数字或其他类型。

>>> L1=(1,2,3)
>>> '_'.join(L1)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected str instance, int found

以下两种也不能join。

>>> L1=('ab',2)
>>> L2=('AB',{'a','cd'})

8.修剪:strip、lstrip和rstrip

S.strip([chars])
S.lstrip([chars])
S.rstrip([chars])

分别是移除左右两边、左边、右边的字符char。如果不指定chars或者指定为None,则默认移除空白(空格、制表符、换行符)。

唯一需要注意的是,chars可以是多个字符序列。在移除时,只要是这个序列中的字符,都会被移除。

例如:

移除单个字符或空白。

>>> '  spacious  '.lstrip()
'spacious  '
 
>>> '  spacious  '.rstrip()
'  spacious'
 
>>> 'spacious  '.lstrip('s')
'pacious  '
 
>>> 'spacious'.rstrip('s')
'spaciou'

2.移除字符中的字符。

>>> print('www.example.com'.lstrip('cmowz.'))
example.com
>>> print('wwwz.example.com'.lstrip('cmowz.'))
example.com
>>> print('wwaw.example.com'.lstrip('cmowz.'))
aw.example.com
>>> print('www.example.com'.strip('cmowz.'))
'example'

由于www.example.com的前4个字符都是字符序列cmowz.中的字符,所以都被移除,而第五个字符e不在字符序列中,所以修剪到此结束。同理wwwz.example.com。

wwaw.example.com中第3个字符a不是字符序列中的字符,所以修剪到此结束。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python下如何让web元素的生成更简单的分析
Jul 17 Python
python写xml文件的操作实例
Oct 05 Python
实现python版本的按任意键继续/退出
Sep 26 Python
Python实现简单的获取图片爬虫功能示例
Jul 12 Python
python爬虫爬取淘宝商品信息(selenum+phontomjs)
Feb 24 Python
python 按不同维度求和,最值,均值的实例
Jun 28 Python
python 检查是否为中文字符串的方法
Dec 28 Python
Python关于excel和shp的使用在matplotlib
Jan 03 Python
python实现多层感知器MLP(基于双月数据集)
Jan 18 Python
Python生成MD5值的两种方法实例分析
Apr 26 Python
python2和python3实现在图片上加汉字的方法
Aug 22 Python
Python解析多帧dicom数据详解
Jan 13 Python
Python Logging 日志记录入门学习
Jun 02 #Python
python实现寻找最长回文子序列的方法
Jun 02 #Python
python实现对求解最长回文子串的动态规划算法
Jun 02 #Python
Python 网络爬虫--关于简单的模拟登录实例讲解
Jun 01 #Python
用Python一键搭建Http服务器的方法
Jun 01 #Python
python 编写简单网页服务器的实例
Jun 01 #Python
Django中间件实现拦截器的方法
Jun 01 #Python
You might like
一个oracle+PHP的查询的例子
2006/10/09 PHP
PHP文件上传原理简单分析
2011/05/29 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
2015/01/22 PHP
Symfony2学习笔记之模板用法详解
2016/03/17 PHP
PHP创建自己的Composer包方法
2018/04/09 PHP
基于PHP实现微信小程序客服消息功能
2019/08/12 PHP
JQuery中SetTimeOut传参问题探讨
2013/05/10 Javascript
Nginx上传文件全部缓存解决方案
2015/08/17 Javascript
jquery网页加载进度条的实现
2017/06/01 jQuery
利用yarn代替npm管理前端项目模块依赖的方法详解
2017/09/04 Javascript
基于Node.js实现压缩和解压缩的方法
2018/02/13 Javascript
js中apply()和call()的区别与用法实例分析
2018/08/14 Javascript
JS实现点击拉拽轮播图pc端移动端适配
2018/09/05 Javascript
vue移动端写的拖拽功能示例代码
2020/09/09 Javascript
[57:22]完美世界DOTA2联赛PWL S2 FTD vs PXG 第二场 11.27
2020/12/01 DOTA
深入浅析python继承问题
2016/05/29 Python
Python实现随机生成有效手机号码及身份证功能示例
2017/06/05 Python
Python实现PS图像调整之对比度调整功能示例
2018/01/26 Python
tensorflow创建变量以及根据名称查找变量
2018/03/10 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
2018/04/12 Python
Python在for循环中更改list值的方法【推荐】
2018/08/17 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
2019/05/28 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
css3实现简单的白云飘动背景特效
2020/10/28 HTML / CSS
HTML5页面中尝试调起APP功能
2017/09/12 HTML / CSS
ECCO俄罗斯官网:北欧丹麦鞋履及皮具品牌
2020/06/26 全球购物
小学学雷锋活动总结
2014/04/25 职场文书
代领毕业证委托书
2014/08/02 职场文书
2014年教师党员自我评价范文
2014/09/22 职场文书
全国爱牙日活动总结
2015/02/05 职场文书
节约用电倡议书
2015/04/28 职场文书
交通事故起诉书
2015/05/19 职场文书
爱国教育主题班会
2015/08/14 职场文书
用python删除文件夹中的重复图片(图片去重)
2021/05/12 Python