来源:(微信号:python_cat)”

正如《你真的知道Python的字符串是什么吗?》所写,Python中字符串是由Uniocde编码的字符组成的不可变序列,它具备与其它序列共有的一些操作,例如判断元素是否存在、拼接序列、切片操作、求长度、求最值、求元素的索引位置及出现次数等等。

除此之外,它还有很多特有的操作,值得我们时常温故学习,所以,今天我就跟大家继续聊聊字符串。

本文主要介绍Python字符串特有的操作方法,比如它的拼接、拆分、替换、查找及字符判断等使用方法,辨析了一些可能的误区。最后,还做了两个扩展思考:为什么Python字符串不具备列表类型的某些操作呢,为什么它不具备Java字符串的一些操作呢?两相比较,希望能帮助你透彻地理解——Python的字符串到底怎么用?

0.拼接字符串

字符串的拼接操作最常用,我专门为这个话题写过一篇《详解Python拼接字符串的七种方式》,建议你回看。

在此,简单回顾一下:七种拼接方式从实现原理上划分为三类,即格式化类(%占位符、format()、template)、拼接类(+操作符、类元祖方式、join())与插值类(f-string),在使用上,我有如下建议——

当要处理字符串列表等序列结构时,采用join()方式;拼接长度不超过20时,选用+号操作符方式;长度超过20的情况,高版本选用f-string,低版本时看情况使用format()或join()方式。

不敢说字符串就只有这七种拼接方式,但应该说它们是最常见的了。有小伙伴说,我写漏了一种,即字符串乘法,可以重复拼接自身。没错,从结果上看,这是第八种拼接方式,视为补充吧。

关于字符串拼接,还得补充一个建议,即在复杂场景下,尽量避免使用以上几类原生方法,而应该使用外置的强大的处理库。比如在拼接SQL语句的时候,经常要根据不同的条件分支,来组装不同的查询语句,而且还得插入不同的变量值,所以当面临这种复杂的场景时,传统拼接方式只会加剧代码的复杂度、降低可读性和维护性。使用SQLAlchemy模块,将有效解决这个问题。

1.拆分字符串

在字符串的几种拼接方法中,join()方法可以将列表中的字符串元素,拼接成一个长的字符串,与此相反,split()方法可以将长字符串拆分成一个列表。前面已说过,字符串是不可变序列,所以字符串拆分过程是在拷贝的字符串上进行,并不会改变原有字符串。

split()方法可接收两个参数,第一个参数是分隔符,即用来分隔字符串的字符,默认是所有的空字符,包括空格、换行(/n)、制表符(/t)等。拆分过程会消耗分隔符,所以拆分结果中不包含分隔符。s='Helloworld'l='''Hithere,mynameisPython猫Doyoulikeme?'''#不传参数时,默认分隔符为所有空字符s.split()>>>['Hello','world']s.split('')>>>['Hello','world']s.split('')>>>['Helloworld']#不存在两个空格符s.split('world')>>>['Hello','']#空字符包括空格、多个空格、换行符等l.split()>>>['Hi','there',',','my','name','is','Python猫','Do','you','like','me','?']

split()方法的第二个参数是一个数字,默认是缺省,缺省时全分隔,也可以用maxsplit来指定拆分次数。#按位置传参l.split('',3)>>>['Hi','there',',','mynameisPython猫/nDoyoulikeme?/n']#指定传参l.split(maxsplit=3)>>>['Hi','there',',','mynameisPython猫/nDoyoulikeme?/n']#错误用法l.split(3)---------------TypeErrorTraceback(mostrecentcalllast)in()---->1l.split(3)TypeError:mustbestrorNone,nont

split()方法是从左往右遍历,与之相对,rsplit()方法是从右往左遍历,比较少用,但是会有奇效。

拆分字符串还有一种方法,即splitlines(),这个方法会按行拆分字符串,它接收一个参数True或False,分别决定换行符是否会被保留,默认值False,即不保留换行符。#默认不保留换行符'abc/n/ndefg/rkl/r/n'.splitlines()>>>['abc','','defg','kl']'abc/n/ndefg/rkl/r/n'.splitlines(True)>>>['abc/n','/n','defg/r','kl/r/n']

2.替换字符串

替换字符串包括如下场景:大小写替换、特定符号替换、自定义片段替换……

再次说明,字符串是不可变对象,以下操作并不会改变原有字符串。

以上这些方法都很明了,使用也简单,建议你亲自试验一下。这里只说说strip()方法,它比较常用,可以去除字符串前后的空格,不仅如此,它还可以删除首末位置的指定的字符。s='******Helloworld******'s.strip('*')>>>'Helloworld'

3.查找字符串

查找字符串中是否包含某些内容,这是挺常用的操作。Python中有多种实现方式,例如内置的find()方法,但是这个方法并不常用,因为它仅仅告诉你所查找内容的索引位置,而在通常情况下,这个位置并不是我们的目的。

find()方法与index()方法的效果一样,它们的最大的区别只在于,找不到内容时的返回值不同,一个返回-1,一个抛出异常:s='Helloworld's.find('cat')>>>-1s.index('cat')>>>ValueErrorTraceback(mostrecentcalllast)in()---->1s.index('cat')ValueError:substringnotfound

以上两个方法,只能用来满足最简单的查找需求。在实战中,我们常常要查找特定模式的内容,例如某种格式的日期字符串,这就得借助更强大的查找工具了。正则表达式和re模块就是这样的工具,正则表达式用来定制匹配规则,re模块则提供了match()、find()及findall()等方法,它们组合起来,可以实现复杂的查找功能。限于篇幅,今后再对这两大工具做详细介绍,这里有一个简单的例子:importredatepat=re.compile(r'/d+//d+//d+')text='Todayis11/21/2018.Tomorrowis11/22/2018.'datepat.findall(text)>>>['11/21/2018','11/22/2018']

4.字符判断

判断字符串是否(只)包含某些字符内容,这类使用场景也很常见,例如在网站注册时,要求用户名只能包含英文字母和数字,那么,当校验输入内容时,就需要判断它是否只包含这些字符。其它常用的判断操作,详列如下:

5.字符串不可以做的事

上文内容都是Python字符串特有的操作方法,相信读完之后,你更清楚知道Python能够做什么了。

但是,这还不足以回答本文标题的问题——你真的知道Python的字符串怎么用吗?这些特有的操作方法,再加上之前文章提到的序列共有的操作、字符串读写文件、字符串打印、字符串Intern机制等等内容,才差不多能够回答这个问题。

尽管如此,为了体现严谨性,我试着再聊聊“Python字符串不可以做的事”,从相反的维度来补充回答这个问题。下面是开拓思维,进行头脑风暴的时刻:

(1)受限的序列

与典型的序列类型相比,字符串不具备列表的如下操作:append()、clear()、copy()、insert()、pop()、remove(),等等。这是为什么呢?

有几个很好理解,即append()、insert()、pop()和remove(),它们都是对单个元素的操作,但是,字符串中的单个元素就是单个字符,通常没有任何意义,我们也不会频繁对其做增删操作,所以,字符串没有这几个方法也算合理。

列表的clear()方法会清空列表,用来节省内存空间,效果等于anylist[:]=[],但是,奇怪的是,Python并不支持清空/删除操作。

首先,字符串没有clear()方法,其次,它是不可变对象,不支持这种赋值操作anystr[:]='',也不支持delanystr[:]操作:s='Helloworld's[:]=''>>>报错:TypeError:'str'objectdoesnotsupportitemassignmentdels[:]>>>报错:TypeError:'str'objectdoesnotsupporTItemdeleTIon

当然,你也别想通过dels来删除字符串,因为变量名s只是字符串对象的引用(挖坑,以后写写这个话题),只是一个标签,删除标签并不会直接导致对象实体的消亡。

如此看来,想要手动清空/删除Python字符串,似乎是无解。

最后还有一个copy()方法,这就是拷贝嘛,可是字符串也没有这个方法。为什么呢?难道拷贝字符串的场景不多么?在这点上,我也没想出个所以然来,搁置疑问。

通过以上几个常用列表操作的比较,我们可以看出字符串这种序列是挺受限的。列表可以看成多节车厢链接成的火车,而字符串感觉就只像多个座椅联排成的长车厢,真是同源不同相啊。

(2)比就比,谁怕谁

接下来,又到了Python字符串与Java字符串PK的时刻。在上一篇文章《你真的知道Python的字符串是什么吗?》中,它们已经在对象定义的角度切磋了两回合,胜利的天平倒向了Python,这次看看会比出个啥结果吧。

Java中有比较字符串的方法,即compareTo()方法与equals()方法,前一个方法逐一比较两个字符串的字符编码,返回一个整型的差值,后一个方法在整体上比较两个字符串的内容是否相等。

Python字符串没有这两个单独的方法,但要实现类似的功能却很简便。先看例子:myName="Python猫"cmpName="world"newName=myName#直接用比较符号进行comparemyName>cmpName>>>FalsemyName==newName>>>TruecmpName!=newName>>>True#比较是否同一对象myNameiscmpName>>>FalsemyNameisnewName>>>True

上例中,如果把赋值的字符串换成列表或者其它对象,这些比较操作也是可以进行的。也就是说,作比较的能力是Python公民们的一项基本能力,并不会因为你是字符串就给你设限,或者给你开特权。

与此类似,Python公民们自带求自身长度的能力,len()方法是内置方法,可以直接传入任意序列参数,求解长度。Java中则要求不同的序列对象,只能调用各自的length()方法。说个形象的比喻,Python中共用一把秤,三教九流之辈都能拿它称重,而Java中有多把秤,你称你的,我称我的,大家“井水不犯河水”。

Python中曾经有cmp()方法和__cmp__()魔术方法,但官方嫌弃它们鸡肋,所以在Python3中移除掉了。虽然在operator模块中还为它留下了一脉香火,但保不定哪天就会彻底废弃。importoperatoroperator.eq('hello','name')>>>Falseoperator.eq('hello','hello')>>>Trueoperator.gt('hello','name')>>>Falseoperator.lt('hello','name')>>>True

(3)墙上的门

在Java中,字符串还有一个强大的valueOf()方法,它可以接收多种类型的参数,如boolean、char、char数组、double、float、int等等,然后返回这些参数的字符串类型。例如,要把int转为字符串,可以用String.valueOf(anynum)。

Python字符串依然没有这个单独的方法,但要实现相同的功能却很简便。对Python来说,不同的数据类型转换成字符串,那是小菜一碟,例如:str(123)>>>'123'str(True)>>>'True'str(1.22)>>>'1.22'str([1,2])>>>'[1,2]'str({'name':'python','sex':'male'})>>>"{'name':'python','sex':'male'}"

而从字符串转换为其它类型,也不难,例如,int('123')即可由字符串'123'得到数字123。对比Java,这个操作要写成Integer.parseInt('123')。

在Java的不同数据类型之间,那道分隔之墙矗立得很高,仿佛需要借助一座更高的吊桥才能沟通两边,而在灵活的Python里,你可以很方便地打开墙上的那扇门,来往穿越。

小结一下,跟Java相比,Python字符串确实没有几项方法,但是事出有因,它们的天赋能力可不弱,所有这些操作都能简明地实现。一方面,Python字符串做不到某些事,但是另一方面,Python可以出色地做成这些事,孰优孰劣,高下立判。

6.总结

写文章贵在善始善终,现在给大家总结一下:本文主要介绍Python字符串特有的操作方法,比如它的拼接、拆分、替换、查找及字符判断等使用方法,从正向回答,Python字符串能做什么?最后,我们还从反向来回答了Python字符串不能做什么?有些不能做,实际上是不为,是为了在其它地方更好地作为,归根到底,应该有的功能,Python字符串全都有了。

本文中依然将Python与Java做了比较,有几项小小的差异,背后反映的其实是,两套语言系统在世界观上的差异。古人云,以铜为镜,可以正衣冠。那么,在编程语言的世界里,以另一种语言为镜,也更能看清这种语言的面貌。希望这种跨语言的思维碰撞,能为你擦出智慧的火花。

编辑:hfy

python字符串操作_浅谈Python 字符串特有的操作方法相关推荐

  1. python中文字符串编码_浅谈python下含中文字符串正则表达式的编码问题

    前言 Python文件默认的编码格式是ascii ,无法识别汉字,因为ascii码中没有中文. 所以py文件中要写中文字符时,一般在开头加 # -*- coding: utf-8 -*- 或者 #co ...

  2. python hasattr函数_浅谈python中的getattr函数 hasattr函数

    hasattr(object, name) 作用:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的). 示例: & ...

  3. python 迭代器协议_浅谈Python中的生成器和迭代器

    迭代器 迭代器协议 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代.(只能往前走,不能往后退!) 迭代器对象 遵循了(实现了)迭代器协议的对象.(对象内 ...

  4. python表格对齐_浅谈python str.format与制表符\t关于中文对齐的细节问题

    写了一个练手的爬虫...在输出的时候出现了让人很不愉♂悦的问题 像这样: 令人十分难受啊! #------------------------------------------ 在此之前先说一下py ...

  5. python未定义_浅谈Python程序的错误:变量未定义

    Python程序的错误种类 Python程序的错误分两种.一种是语法错误(syntax error).这种错误是语句的书写不符合Python语言的语法规定.第二种是逻辑错误(logic error). ...

  6. python制表符对齐_浅谈python str.format与制表符\t关于中文对齐的细节问题

    写了一个练手的爬虫...在输出的时候出现了让人很不愉♂悦的问题 像这样: 令人十分难受啊! #------------------------------------------ 在此之前先说一下py ...

  7. python编写函数_浅谈Python 函数式编程

    匿名函数lambda表达式 什么是匿名函数? 匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lambda 关键字编写简单的代码逻辑.lambda 本质上是一个 ...

  8. python static方法_浅谈python 类方法/静态方法

    1.类方法 类方法是从属于"类对象"的方法.类对象可以通过装饰器@classmethod来定义,具体格式如下: @classmethod def 类方法名(cls [, 形参列表] ...

  9. python float 精度_浅谈Python里面小数点精度的控制

    要求较小的精度 round()内置方法 这个是使用最多的,刚看了round()的使用解释,也不是很容易懂.round()不是简单的四舍五入的处理方式. For the built-in types s ...

最新文章

  1. python def函数报错详解_【python】详解python函数定义 def()与参数args、可变参数*args、关键参数**args使用实例...
  2. SQLServer之创建AFETER DELETE触发器
  3. 黑马程序员.bobo.DAY.2
  4. 最大排列问题的算法实现(Python)究竟最后调换位置的有哪几个?
  5. [BUUCTF-pwn]——jarvisoj_tell_me_something
  6. 在 SAP Kyma 上部署一个 Go MSSQL API Endpoint
  7. SAP Spartacus 如何使用 cypress 进行端到端自动化测试
  8. Centos 磁盘管理及配额管理
  9. 6-7 使用函数输出水仙花数_「Java」再议printf函数
  10. 管理系统中计算机应用第二章,管理系统中计算机应用第二章.doc
  11. 【转】C#+csgl库进行OpenGL编程
  12. Java 1.2.1 读取输入
  13. 宏图之下服务器维护,《鸿图之下》3月24日维护更新预告
  14. 从鸽笼原理到拉姆塞数
  15. 概率论基础-严士健 第二版 习题与补充3.3答案
  16. 解决vuepress-theme-reco中文标签跳转返回404问题
  17. Python入门题031:excel表格筛选重复数据
  18. PyautoGui常用教程(鼠标、键盘)
  19. 微信内置浏览器打不开链接怎么办,实现微信跳转链接
  20. 最好的防御就是进攻 任正非

热门文章

  1. python软件使用教程-python用什么软件编写
  2. python2好还是python3好-总结对比Python2和Python3之间的区别
  3. python自学入门教程-Python自学入门基础教程-数据类型
  4. python代码示例下载-python下xml解析库lxml最新版下载安装以及代码示例
  5. python自动化办公脚本下载-基于python实现自动化办公学习笔记二
  6. python爬虫能做什么项目-python爬虫实例项目大全
  7. python基础知识ppt-python入门ppt下载
  8. 使用python+opencv和pillow以及numpy对图像进行旋转,以及解决图像旋转过程中出现的黑边问题
  9. LeetCode Battleships in a Board
  10. Gallery的使用(一)