当前位置: 首页 > Linux

你真的知道如何使用Python字符串吗?

时间:2023-04-06 18:25:42 Linux

正如《你真的知道Python的字符串是什么吗?》所写,Python中的字符串是由Uniocde编码的字符组成的不可变序列。它有一些和其他序列相同的操作,比如判断元素是否存在、拼接序列、切片操作、求长度、求最大值、求元素的索引位置和出现次数等。此外,它还有很多独特的操作,值得时时学习,??所以今天继续和大家聊聊字符串。本文主要介绍了Python字符串的拼接、拆分、替换、查找、字符判断等独特的操作方法,并指出了一些可能的误解。最后我也做了两个延伸的思考:Python字符串为什么没有list类型的一些操作,Java字符串为什么没有一些操作?两个阶段的对比,希望能帮助大家彻底理解——Python字符串是如何使用的?0.字符串拼接字符串的拼接操作是最常用的。我专门针对这个话题写了一篇文章《详解Python拼接字符串的七种方式》,建议大家回头看看。在此简单回顾一下:七种拼接方法从实现原理上分为三类,分别是格式化(%占位符、format()、模板)、拼接(+运算符、类元组方法、join())和插值class(f-string),在使用上,我有以下建议——在处理字符串列表等序列结构时,使用join()方法;当拼接长度不超过20时,使用+算子方法;如果长度超过20,高版本使用f-string,低版本根据情况使用format()或join()。不敢说字符串只有这七种拼接方式,但应该说是最常见的。有朋友说我漏了一个,就是字符串乘法,可以自己反复拼接。没错,从结果来看,这就是第八种拼接方式,算是补充一下吧。关于字符串拼接,我不得不补充一个建议??,就是在复杂的场景下,尽量避免使用上述几类native方法,而是使用外部强大的处理库。比如在拼接SQL语句时,往往需要根据不同的条件分支拼装出不同的查询语句,插入不同的变量值,所以面对如此复杂的场景,传统的拼接方式只会加重代码的负担。复杂性,降低可读性和可维护性。使用SQLAlchemy模块将有效解决这个问题。1、拆分字符串在字符串的几种拼接方法中,join()方法可以将列表中的字符串元素拼接成一个长字符串,相反,split()方法可以将长字符串拆分成一个列表。前面说过,字符串是一个不可变的序列,所以字符串拆分过程是对复制的字符串进行的,不会改变原来的字符串。split()方法可以接收两个参数。第一个参数是分隔符,它是用来分隔字符串的字符。默认为全空字符,包括空格、换行符(n)、制表符(t)等。拆分过程会消耗分隔符,因此分隔符不包含在拆分结果中。s='Helloworld'l='''嗨,我叫Python猫,你喜欢我吗?'''#不传参数时,默认分隔符全为空字符s.split()>>>['Hello','world']s.split('')>>>['Hello','world']s.split('')>>>['Helloworld']#没有两个空格s.split('world')>>>['Hello','']#空字符包括空格、多个空格、换行符等l.split()>>>['Hi','there',',','my','name','is','Pythoncat','Do','you','like','me','?']split()方法的第二个参数是aNumber,默认为default,默认为fullseparation,也可以使用maxsplit来指定split的个数。#按位置传递参数l.split('',3)>>>['Hi','there',',','我叫Python猫\n你喜欢我吗?\n']#指定参数l.split(maxsplit=3)>>>['嗨','那里',',','我叫Python猫\n你喜欢我吗?\n']#错误用法l.split(3)----------------TypeErrorTraceback(最近调用last)in()---->1l.split(3)TypeError:必须是str或者None,不能是intsplit()方法从左到右遍历。相比之下,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.replaceString替换String包括以下几种场景:大小写替换、特定符号替换、自定义片段替换……再次说明,字符串是不可变对象,后面的操作不会改变原来的字符串。这些方法很清楚,简单易用,建议大家自己尝试一下。这里只说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.Characterjudgement判断字符串是否(只)包含一些Character内容,这样的使用场景也很常见。例如在网站注册时,要求用户名只能包含英文字母和数字。那么在验证输入内容时,需要判断是否只包含这些字符。其他常用的判断操作列举如下:五、字符串不能做的事情以上内容是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[:]>>>Error:TypeError:'str'objectdoesnotsupportitemdeletion当然,你不想通过dels删除String,因为变量名s只是对字符串对象的引用(挖个坑,以后再写这个话题),只是一个标签,删除标签并不会直接导致对象实体消亡。从这点来看,手动清空/删除Python字符串似乎没有解决办法。最后还有一个copy()方法,就是复制,但是字符串也没有这个方法。为什么?复制字符串的场景不是很多吗?至此,我想不出一个理由,也就放下了疑虑。通过上面常见的列表操作的对比,我们可以看出字符串的序列是相当有限的。单子可以看成是由多节车厢组成的火车,而弦则感觉像是一节由多个座位组成的长车厢。真是同源异相。(2)比吉比,谁怕谁?接下来就是Python字符串和Java字符串的PK了。在上一篇《你真的知道Python的字符串是什么吗?》中,他们已经从对象定义的角度讨论了两轮,胜利的天平已经落到了Python手上。且看这次的结果如何。Java中有比较字符串的方法,即compareTo()方法和equals()方法。前一种方法是将两个字符串的字符编码逐个进行比较,返回一个整数差,而后一种方法是将两个字符串作为一个整体进行比较。字符串内容是否相等。Python字符串没有这两个独立的方法,但是很容易实现类似的功能。先看例子:myName="Pythoncat"cmpName="world"newName=myName#直接用比较符号比较myName>cmpName>>>FalsemyName==newName>>>TruecmpName!=newName>>>True#比较是否是同一个对象myName是cmpName>>>FalsemyName是newName>>>True在上面的例子中,如果赋值的字符串被替换为列表或者其他对象,也可以进行这些比较操作。也就是说,比较能力是Python公民的基本能力,不会因为你是字符串就被限制或享有特权。同样,Python公民有能力找到自己的长度。len()方法是内置方法,可以直接传入任意序列参数求长度。在Java中,需要不同的序列对象,只能调用各自的length()方法。打个形象的比喻,Python有一个通用的秤,老少皆宜,但Java有很多秤,你称你的,我称我的,大家“井水不犯江水”。Python中曾经有cmp()方法和__cmp__()魔术方法,但被官方鄙视为鸡肋,所以在Python3中被移除。虽然在运营商模块中还留有一丝香火,但说不定哪天就被彻底抛弃了。importoperatoroperator.eq('hello','name')>>>Falseoperator.eq('hello','hello')>>>Trueoperator.gt('hello','name')>>>Falseoperator.lt('hello','name')>>>True(3)墙上的门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字符串的独特操作方法,如它的拼接、拆分、替换、查找和字符判断等,从正面回答,Pythonstrings可以做什么?最后,我们还反向回答了Python字符串不能做什么?有些做不到,其实也没有做,是为了其他地方表现的更好。说到底,Python字符串该有的功能都有。在本文中,Python和Java还是进行了比较。有几个细小的差异,其实反映了两种语言体系世界观的差异。古人说,以铜为镜,可以整衣裳。那么,在编程语言的世界里,以另一种语言为镜,更能看清这门语言的面目。希望这种跨语言的思维碰撞能为你擦出智慧的火花。最后,福利时刻:本公众号(蟒猫)由清华大学出版社赞助,抽奖送出两本新书《深入浅出Python机器学习》。截止日期为11月29日18:18,点击此链接即刻参与。---------------本文首发于微信公众号【蟒猫】,后台回复“爱学习”,送20+精选e-免费书籍。延伸阅读:《详解Python拼接字符串的七种方式》《你真的知道Python的字符串是什么吗?》Java字符串比较方法:https://blog.csdn.net/barryha...为什么Python3取消了cmp方法:https://www.zhihu.com/questio...