Python学习之:字符串对象
第六章:字符串对象python字符串对象这一章节的学习感悟。字符串的常用方法1.字符串函数常用操作str.lower()#吧str字符串转化为小写str.upper()#把str字符串转化为大写str.split(sepNone)#把str按照sep进行分割结果为新的字符串str.conut(sub)#sub字符串在str中出现的次数str.find()#查询字符串是否存在不存在会返回-1str.index()#查询字符串是否存在如果不存在字符串报错str.startwith(s)#查询字符串str是否以s开头str.endwith(s)#查询字符串是否以s结尾演示如下演示1-lower,upper,find,index函数对于s1.index函数可以看到当查询的字符在字符串中不存在的时候会报错。2.字符串函数进阶操作演示sHelloWorldnew_ss.replace(o,你好,2)#最后的参数是替换的次数print(new_s)print(s.center(20,*))s1 Hello World #去掉字符串的空格print(s1.strip())#没有参数的时候会默认去掉空格print(s1.lstrip())print(s1.rstrip())#有参数的时候会默认去掉指定的参数s3HBan BHing~~~print(s3.strip(HB))#strip的运行逻辑从左侧开始直到遇到不在char类型的字符串为止如果遇到char类型的字符串删掉#然后再从右侧开始同样逻辑其实限制条件蛮苛刻的你看上面的我右侧的HB 就没有被删掉#strip不会管你的顺序要删掉的str而言。s4HBan ingBHprint(s4.strip(HB))replace(o,‘你好,2):三个参数替换前的字符串替换后的字符串替换的次数。最后替换次数不写的时候默认全部替换。s.center(20,*):.center是居中函数*代表如果字符串长度不足20的话会用填充s.strip()参数代表要去掉的字符没有的话默认是去掉空格。**注**strip函数的去掉参数类型其实挺严格的strip是分别从左侧和右侧开始遍历整个字符串如果遇到符号条件的字符就会删掉此时它不会管你字符的顺序是否一致。但是如果遇到不符合条件的字符就会直接停止此次遍历。这里我也是问gpt才知道的。你看下文第一个字符串s3HBan BHing~~~的最后的BH很明显没有被删掉。但是字符串s4HBan ingBH最后的HB就很明显被删掉了。格式化字符串1.连接操作格式化字符串可以简化各字符串之间的连接操作。解决的是什么问题呢python中直接使用去连接数据时必须保持类型一致。否则可能会报错。如一般的数字16和字符串helloworld连接需要使用str()函数先把数字转换为字符串才能使用连接。下面介绍三种格式化字符串方式使用占位符的情况#使用占位符的情况name马冬梅age18score98.5print(姓名:%s,年龄%d,成绩%f%(name,age,score))#但是这种写法貌似已经被抛弃比c语言还要复杂学过c语言的应该不会陌生这个 print函数但是python作为一种高级语言很明显这种方式会慢慢淘汰。f-string方式这个方法是主流的方式;f({})向python声明里面的{}是一个表达式块优先执行这个{}里面的内容。#f-string写法简洁又高效#f的意思代表里面{}是代码也可以是任何表达式python会优先执行这段代码或者拿到这个变量的值放进去从而规避了str占用空间或者原来的占位符写法过于繁琐的问题print(f姓名{name},年龄:{age},成绩{score})format格式写法这种方式利用了.format函数的参数传递方式。#format写法#利用.format函数的参数对{}里面的序号进行赋值print(姓名{0},年龄{1}成绩{2}.format(name,age,score))可以看到运行结果是一致的。tip:format的参数顺序是固定的但是调用参数的顺序可以不一致。format(a,b,c)️就是第一个参数依次类推。但是前面调用format的时候不一定非得按照{1}{2}{3}的顺序来。2.控制精细格式这些控制格式都是放在{}里面的。示例如下shello world#*代表不足20的时候用*填充#0从第0个参数开始:代表格式说明print({0:*20}.format(s))print({0:*20}.format(s))print({0:*^20}.format(s))#^代表居中对齐#center也可以居中对齐print(s.center(20,*))#千位分隔符,print({0:,}.format(987654321))print({0:,}.format(987654321.123))#控制小数部分精度print({0:.2f}.format(3.1415926))print({0:.5}.format(HanBing777))a425print(f十进制:{a:d}十六进制:{a:x}八进制:{a:o}二进制:{a:b})#f-string写法更好些我觉得b3.1415926print({0:.2f},{0:.2E},{0:.2e},{0:.2%}.format(b))#.format和切片写法print({0:*^20}.format(s))的居中对齐方式可以类比于print(s.center(20))的居中对齐方式{0:*^20}:0:从序号0开始即第一位开始切片操作:是引导符号告诉format方法^居中对齐*^20:长度20位居中对齐。不足的部分用*填充(“{0:.2f}”.“{0:.2f}”.:引导符号.2f:代表保留位小数。学过c语言的应该不陌生类似还有.2%,.2e等形式代码演示的运行结果如下字符串的编码和解码1.为什么需要编码和解码?计算机传输数据时使用的是字节流的形式而人类使用编译器编译语言的时候使用的是可读性高的高级语言。因此。计算机接收其他计算机的数据时需要对接收来的数据进行解码同理。发送数据时也需要进行编码。常见的编码方式utf-8,base64等等。下面分别是编码和解码函数的参数格式演示s你好中国scodes.encode(errorsreplace)#repalce会替换?#默认是utf-8格式print(scode)#输出的/x待变这是十六进制python默认的输出方式print(scode.hex( ))#gbk编码scode_gbks.encode(gbk,errorsreplace)print(scode_gbk)#errorstrict/ignore/replace:#strict: 碰见会报错#ignore忽略报错#解码print(bytes.decode(scode_gbk,gbk,errorsreplace))print(bytes.decode(scode,utf-8,replace))replace模式遇到不在编码规则里面的字符会用进行替换strict:严格模式遇到不符合规则的会报错ignore:直接忽略掉不在编码规则里面的字符强行解码/编码下个字符tips:python为了区分字节流会用\x的形式来区分每一个字节用来告诉人类这是16进制字节的形式如果想直接把机器码输出出来需要用到print(scode.hex( ))这样的代码。字符串的数据验证函数数据验证函数都是bool函数返回的都是false或者True的结果isdigit函数只会识别阿拉伯数字如果碰见其他类型的如罗马数字汉字这样的会报错print(123.isdigit())print(一二三.isdigit())#False#isdigit只识别十进制的阿拉伯数字isnumeric函数:会识别所有类型的数字罗马数字汉字一二三的数字繁体字壹贰叁这样的数字都可以识别#isnumeric会识别所有语言的数字print(一二三.isnumeric())print(壹贰叁.isnumeric())#TRueisalpha判断字符串是不是全部都是字母组成注意这个函数会把汉字当成字母处理#isalpha判断是否都是字母包含中文字符print(HelloHanBinf哈哈.isalpha())#Trueisalnum会判断字符串是否全部由字母和数字构成这个函数也会把汉字当成字母。#isalnum会包含所有数字和字母print(hello123.isalnum())print(hello你好123.isalnum())print(hello你好一二三.isalnum())print(hellp你好壹贰叁.isalnum())#全部都是True其他的就不演示了。字符串的拼接操作包含几种方法直接拼接利用.join方法进行连接。还有利用格式化字符串进行拼接这三种方法。演示s1Hellos2World#第一种拼接直接print(s1s2)#第二种拼接利用join函数,把s1和s2当成列表中的元素print(.join([s1,s2]))print(*.join([s1,s2]))print(你好.join([s1,s2]))#直接拼接print(HelloWorld)#讲真有点无聊这个方式笑死我了#格式化字符串拼接print(%s%s%(s1,s2))print(f{s1}{s2})#f-string方式print({0}{1}.format(s1,s2))#format拼接.join函数会对期中的列表中间插入注意是中间。print(.join([s1,s2]))相当于在s1和s2字符串中间插入空白字符串但是空白字符串没有内容。所以就实现了物理意义上的连接。f-string方式我一般还是喜欢用这个。因为比较万能。因为.format还有.join的一些方法都可以被它替代print(f{s1}{s2})#f-string方式字符串的去重操作第一种方法遍历去重本质是利用item或者索引进行双重循环遍历碰见在a不在b的字符串进行拿过来就行#第一种方式就是利用双重循环进行遍历遇到在a不在b的元素加进去shellowrodooadowadnandawovadnew_sforitemins:ifitemnotinnew_s:new_sitemprint(new_s)#第二种方式其实一样用的是索引的方式new_s2foriinrange(len(s)):ifs[i]notinnew_s2:new_s2s[i]print(new_s2)如上成功完成去重。第二种方法集合去重这个我比较推荐。集合具有唯一性。利用集合函数我们可以轻易实现去重。但是需要注意的是集合具有无序性。因此对于去重后的字符串我们的顺序可能与去重前不一致。因此需要进行重新排序。此时利用列表函数的排序功能就行。#第三种方式用集合去重列表排序new_s3set(s)#顺序不确定lstlist(new_s3)lst.sort(keys.index)#按原字符串第一次出现的位置排序print(.join(lst))#[lst]列表直接输出的时候会带方括号set函数转换为集合list函数创建为列表.sort函数对列表进行排序keys.index按照s中原来字符串第一次出现的位置进行排序。这就是sort函数的强大功能。哪怕索引的值在要排序的字符串中不存在他会直接忽略去下一个找到存在的索引的值进行排序。print(.join(lst))直接print打印出来的是[]列表为了直接把元素打印出来。我们一可以遍历二可以把它直接利用字符串拼接函数把列表对象转换为字符串。我只能说妙极了~正则表达式概念正则表达式正则表达式Regular Expression简称 Regex 或 RE本质上是一种用来匹配字符串的强力规则语言。它名字是表达式实际上是一个强大的符号匹配工具。通过它我们可以快速过滤掉我们不需要的结果。正则表达式由普通字符如a,b,1和元字符具有特殊含义的符号组成。 正则表达式使用的是python内部的模块re,不需要进行下载。直接import re就行了下面举出几个正则表达式的应用例子re模块之match函数使用正则表达式需要指定规则上面图片的格式就是规则的格式。importre patternr\d\.\dsI Study Python 3.1.1 everydayprint(re.match(pattern,s))#Nones13.1.1 python I Study everydaymatch2re.match(pattern,s1)print(match2)#0-3区间匹配成功#输出匹配元素print(匹配的起始位置,match2.start())print(匹配的结束位置,match2.end())print(匹配的位置元素,match2.span())#元组print(待匹配的字符串,match2.string)print(匹配的数据,match2.group())#match是从开始位置开始匹配规则patternr’\d.\drr用于说明这个表达式是个正则表达式的规则。代表规则的内容\d.\d \d任意十进制数,\.用于匹配这个.,后面的\d代表的意思也是任意十进制数的意思代表这个十进制数可以出现一次或者多次match函数会从字符串的起始位置开始匹配如果起始位置不满足match就会直接退出。也就是说如果要匹配的字符串由多次出现或者match是从中间开始匹配的字符串那么使用match函数就找不到要匹配的结果。看起来match挺鸡肋的如上图因为3.1.1在字符串的中间match是从I开始的。所以match没有匹配到如下图因为3.1.1在待匹配的字符串开头。match找到了输出了对应位置。输入匹配的信息match.start输出起始位置的序号match.end输出结束位置的序号**match.group:**输出匹配的字符串这是最重要的。还有其他的函数我懒得写了。输出结果见下图。记住match.group就行了。re 模块之search函数既然match函数如此鸡肋我们直接用search函数吧。importre patternr\d.\dsI Study Python 3.11 every day Python 2.7 I Love youmatchre.search(pattern,s)#只能找到3.11print(match)s24.10 Python I study ever daymatch2re.search(pattern,s2)print(match2)s3I study Python every daymatch3re.search(pattern,s3)print(match3)#None,没有数字版本的匹配print(match.group())print(match2.group())#输出版本search函数会比match函数好用一些因为他会从开始位置开始匹配直到找到满足规则的字符串为止不像match函数只针对字符串开头。search函数缺失会存在一定的寻找功能。当寻找不到的时候会返回None如上图所示可以看到对于字符串sI Study Python 3.11 every day Python 2.7 I Love you和s2“4.10 Python I study ever day”,search都找到了对于的版本号信息。但是search函数也有个很大的缺陷它找到对应结果后就会返回。也就是说。search函数只能寻找一次。。。。。。对于字符串I Study Python 3.11 every day Python 2.7 I Love yousearch函数只找到了3.11,没有找到2.7.re模块之findall函数finall函数是对上述两个查找函数的进阶。没错他们的缺点在findall函数中都进行弥补。python为什么会设置match和search函数我想是在实际项目需求中有它的需要。对于查找全部符合类型的字符串就像findall函数的名字一样他能满足你的需求。importre patternr\d.\dsI Study Python 3.11 every day Python 2.7 I Love yous24.10 Python I study ever days3I study Python every day#结果是一个列表类型lstre.findall(pattern,s)lst2re.findall(pattern,s2)lst3re.findall(pattern,s3)print(lst)print(lst2)print(lst3)findall韩会返回满足条件的字符串无需group函数输出直接使用列表输入就行。可以看到无论是s还是s2还是s3,对应的版本号信息3.11或者2.7或者4.10都被找到。对于s3,输出空列表。代表finall的返回值是空。实际应用中这三个查找函数没有绝对好坏按照实际需求选择。re模块之sub函数sub函数对于匹配到的规则按照给定的参数进行替换。实际应用很广泛。例如对于某个网站如果想屏蔽一些关键词如“黑客破解之类或者脏话的’。服务器就可以对用户的输入进行一个sub函数校验。如果出现屏蔽词就进行对应的替换。还蛮有意思的。importre pattern黑客|破解|反爬s我想学习python,想破解vip视频python可以实现无底线反爬吗new_sre.sub(pattern,XXX,s)print(new_s)#nb的正则表达式可以看到输出结果如上图所示对于s中字符串出现的违规内容都被xxx 替换了。说明:re.sub(pattern,‘xxx’,s)pattern使用的正则表达式规则xxx:替换使用的字符串s: 待匹配的字符串。re模块之split函数这两个函数sub函数和split函数使用后相信你才能感受到正则表达式的魅力所在。split函数主要用于对规则集的分割。按照给定参数。s2https://www.baidu.com/s?wdysjrsv_spt1pattern2[?|]#【代表区间】lstre.split(pattern2,s2)print(lst)#可以看到已经分割完成可以看到对于https://www.baidu.com/s?wdysjrsv_spt1这个字符串split函数成功按照我们设定的规则进行了分割。re.split(pattern,s2):pattern;正则表达式规则s2待匹配的字符串[ ?|]在区间内使用?或者进行分割。会删除掉? 和字符章末总结部分实战练习本章的重点就是讲了下常见的字符串处理函数的使用方法和格式化字符串的三种方式以及正则表达式的应用。下面演示两个较为简单的小型实战实验一使用fomat格式化字符串question: 统计字符串中字符出现的个数答案sHelloPython,HelloJava,Hellophpwordinput(请输入要统计的字符)print({0} 在 {1}中一共出现了 {2} 次.format(word,s,s.upper().count(word.upper())))主要是利用字符串的count函数进行匹配。但是我们不需要关注字符串的大写和小写。所以我们使用.upper或者.lower转换一下。然后再使用.format函数的参数匹配进行输出。Tips:cout函数统计次数会区分大小写s.uppper().count(word):python可以嵌套调用函数。先调用.upper把s和word进行去小写。然后再利用.cout统计word出现的次数。实战二利用正则表达式过滤字符串对于squeryEnc:%C3%C0%C5%AE,queryExt:美女11stNum.1720,displayNum.1102160,gsm:3c,bdFmtDispNum:约1,000,bdSearchTime:,isNeedAsyncRequest:0,bdIsClustered:1,data:[{adType:0,hasAspData:0,thumbURL:https://img1.baidu.com/it/u272155668,1962283813fm26fmtauto,isCommodity:0,middleURL:https://img1.baidu.com/it/u272155668,1962283813fm26fmtauto,shituToken:aadb3a,largeTnImageUrl:,hasLarge:0,hoverURL:https://img1.baidu.com/it/u272155668,1962283813fm26fmtauto,pageNum:30,objURL:ipprf_z2C$qAzdH3FAzdH3F2t42d_ze3Bkwt17_ze3Bv54AzdH3Ft4w2j_fjw6viAzdH3Ff6vippr%nA%dF%dFetn_ze3Bxt78dn_ze3Bvg%dFstej%dFda81%dFam%dFd1%dF88%dF8ande8cm80ban0nllalnba80_ze3B3r26juj6ippr%nA%dF%dFetn_ze3Bxt78dn_ze3Bvgwrrdaadftzjullll,8aaaaqwbaga2agu4p3rj2?fjv8m9abc98cdpan8vwcw9v9jl1nm88jdllww8dmuwnvvn,fromURL:ippr_z2C$qAzdH3FAzdH3Fe_ze3Bm_ze3BvgAzdH3Fr65utsjAzdH3FowpviMtgt_ze3Brir?et1m8adm8,fromJumpUrl:ippr_z2C$qAzdH3FAzdH3Fe_ze3Bm_ze3BvgAzdH3Fr65utsjAzdH3FowpviMtgt_ze3Brir?et1m8adm8,fromURLHost:v.6.cn,currentIndex:,width:800,height:600,type:jpg,is_gif:0,isCopyright:0,resourceInfo:null,strategyAssessment:3141544242_1243_0_0,filesize:,bdSrcType:0,di:157630,pi:0,is:0,0,imgCollectionWord:,hasThumbData:0,bdSetImgNum:0,partnerId:0,spn:0,bdImgnewsDate:2020-06-03 02:31,fromPageTitle:美女/strong热舞,fromPageTitleEnc:美女热舞,bdSourceName:,bdFromPageTitlePrefix:,isAspDianjiang:0,token:,imgType:,cs:272155668,1962283813,os:1570395708,812629700,simid:272155668,1962283813,personalized:0,simid_info:null,face_info:null,xiangshi_info:null,adPicId:0,source_type:},{ adType:0, hasAspData:0, thumbURL:https://img0.baidu.com/it/u1934854801,2871685401fm253fmtautoapp138fJPEG?w500h313, commodityInfo:null, isCommodity:0, middleURL:https://img0.baidu.com/it/u1934854801,2871685401fm253fmtautoapp138fJPEG?w500h313, shituToken:9bb791, largeTnImageUrl:, hasLarge:0, hoverURL:https://img0.baidu.com/it/u1934854801,2871685401fm253fmtautoapp138fJPEG?w500h313, pageNum:31, objURL:ipprf_z2C$qAzdH3FAzdH3F2t42d_ze3Bkwt17_ze3Bv54AzdH3Ft4w2j_fjw6viAzdH3Ff6vippr%nA%dF%dFt42_ze3B33da_ze3Bv54%dF7r%dFwsst42%dF8889%dFac8dd8aSlnl%dFd8ac8daSlnl-d-8daa_ze3B3r26juj6ippr%nA%dF%dFt42_ze3B33da_ze3Bv54wrrdaadftzjullll,8aaaaqwbaga2agu4p3rj2?fjv8m9abc98cdpbmcukd9vmml18lau1midub9dpnlmpakd请你过滤找到全部的网址信息。答案patternrhttps://img\d{1}.baidu.com/it/u\d*,\d*fm\d*fmtautolstre.findall(pattern,s)foriteminlst:print(item)运行结果如上。说明观察到https://img1.baidu.com/it/u272155668,1962283813fm26fmtauto网站信息都具有这样的格式。那么我们只需要用到finall函数去查找对应的字符串把一些会发生变换的字符如img1,2,3这样的信息用正则表达式过滤掉就行了。rhttps://img\d{1}.baidu.com/it/u\d*,\d*fm\d*fmtautolstre.findall(pattern,s)\d{1}匹配一个任意数字字符\d*匹配任意多个数字字符ENDkd9vmml18lau1midub9dpnlmpakd’请你过滤找到全部的网址信息。 **答案** python patternrhttps://img\d{1}.baidu.com/it/u\d*,\d*fm\d*fmtauto lstre.findall(pattern,s) for item in lst: print(item)[外链图片转存中…(img-u8t582w0-1779291566325)]运行结果如上。说明观察到https://img1.baidu.com/it/u272155668,1962283813fm26fmtauto网站信息都具有这样的格式。那么我们只需要用到finall函数去查找对应的字符串把一些会发生变换的字符如img1,2,3这样的信息用正则表达式过滤掉就行了。rhttps://img\d{1}.baidu.com/it/u\d*,\d*fm\d*fmtautolstre.findall(pattern,s)\d{1}匹配一个任意数字字符\d*匹配任意多个数字字符END