当前位置: 首页 > 后端技术 > Python

由浅入深的Python正则表达式(二)

时间:2023-03-26 16:03:32 Python

CDA数据分析师出品上一篇主要讲解了re模块中的两个比较简单的方法——re.match()和re.search(),还有解释了元字符和限定符,这是正则表达式中最常用的两个符号。但是这两种方法只能匹配字符串中的一个结果,如果要匹配多个怎么办?例如从以下字符串中提取所有公司名称:message='公司名称:CDA数据科学研究所nEmail:1918560461@qq.comn地址:北京市海淀区长洼街3号2号楼3层n网址:http://www.cda.cnn公司名称:广州学习在线科技有限公司n邮箱:981856661@qq.com地址:广州市黄埔区虎林路1198号516室n网站:www.cda.cn'如果我们要提取上面所有的企业名称,显然不可能使用re.match()和re.search()方法。这时候我们可以使用re.findall()方法。re.findall()方法re.findall()方法顾名思义就是在整个字符串中搜索所有满足正则表达式的字符串。合格的字符串最终携带在一个列表中。如果没有匹配的字符串,则返回一个空列表。它的调用和使用方法与re.search()等其他方法类似。看下面的例子:message='公司名称:CDA数据科学研究所n邮箱:1918560461@qq.comn地址:北京市海淀区长洼街3号院2号楼2-3层网址:http://www.cda.cnn公司名称:广州市学习在线科技有限公司n邮箱:981856661@qq.comn地址:广州市黄埔区虎林路1198号516室n网址:www.cda.cn'pattern='公司名称:.*'re.findall(pattern,message)Out:['企业名称:CDA数据科学研究所','企业名称:广州学学在线科技有限公司Ltd.']我们发现re.findall()将两个匹配的字符都提取出来并作为列表的两个元素返回。选择字符如果我们要同时提取公司名称和对应的邮箱,应该如何提取呢?有没有类似于条件判断的“或”选项?是的,您可以使用选择字符“|”此时例如:pattern='公司名称.|email.'message='公司名称:CDA数据科学研究所nEmail:1918560461@qq.comn地址:北京市海淀区2号楼2-3层3、长洼街n网址:http://www.cda.cnn公司名称:广州市学习在线科技有限公司nE-mail:981856661@qq.comn地址:广州市黄埔区虎林路1198号室.516nURL:www.cda.cn'findall=re.findall(pattern,message)print(findall)Out:['企业名称:CDA数据科学研究所','邮箱:1918560461@qq.com','企业名称:广州学习在线科技有限公司','邮箱:981856661@qq.com']等,如果要将企业名称、邮箱、地址一一提取到列表中,只需要输入上面的模式字符串在后面加上“|地址”即可:pattern='公司名称.|email.|地址.*'message='公司名称:CDA数据科学研究所nEmail:1918560461@qq.comn地址:海淀区,北京女长洼街3号2号楼2-3层n网址:http://www.cda.cnn公司名称:广州市学习在线科技有限公司nE-mail:981856661@qq.comn地址:广州市黄埔区虎林路1198号516室nURL:www.cda.cn'findall=re.findall(pattern,message)print(findall)Out:['企业名称:CDA数据科学研究所','Email:1918560461@qq.com','地址:北京市海淀区长洼街3号2号楼2-3层','公司名称:广州学习在线科技有限公司','Email:981856661@qq.com','地址:广州市黄浦区虎林路1198号516室']匹配某些字符。如果要提取特定字符,如“@”、“:”、“.”在上面的消息中,如何分别提取它们?在这种情况下,只需使用一个列表来放置你想要提取的字符,比如下面的例子:pattern='[@:.]'message='公司名称:CDA数据科学研究所nEmail:1918560461@qq.comn地址:北京市海淀区长洼街3号2号楼2层n网址:http://www.cda.cnn公司名称:广州学习在线科技有限公司nEmail:981856661@qq.comn地址:广州市黄埔区虎林路1198号516室n网址:http://www.cda.cnn'findall=re.findall(pattern,message)print(findall)Out:[':',':','@','.',':',':','.','.',':',':','@','.',':',':','.','.']当然,单独提取这些符号意义不大。如果我们要匹配这些符号后面对应的字符怎么办?我们可以在模式串中的列表后添加元字符和限定符:pattern='[@:.].*'message='企业名称:CDA数据科学研究所nEmail:1918560461@qq.comn地址:北京地址:虎林路,广州市黄浦区1198号516室nURL:http://www.cda.cnn'findall=re.findall(pattern,message)print(findall)Out:[':CDA数据科学研究所',':1918560461@qq.com',':北京市海淀区长洼街3号2号楼2层',':www.cda.cn',':广州学习在线科技有限公司',':981856661@qq.com',':广州市黄埔区虎林路1198号516室',':www.cda.cn']同样的,我们可以写提取公司名称、邮箱的例子,上节末地址如下:pattern='[企业邮箱].*'message='企业名称:CDA数据科学研究所n邮箱:1918560461@qq.comn地址:2楼-海淀区长洼街3号2号楼3北京网址:http://www.cda.cnn公司名称:广州学在线科技有限公司邮箱:981856661@qq.com地址:广州市黄埔区虎林路1198号516室网址:www.cda.cn'findall=re.findall(pattern,message)print(findall)Out:['企业名称:CDA数据科学研究所','邮箱:1918560461@qq.com','地址:海淀区长洼街3号,北京2号楼2-3层','公司名称:广州学习在线科技有限公司','Email:981856661@qq.com','地址:黄浦区虎林路1198号516室,广州']上面的patternstring写法相当于匹配以“企业”、“邮政”、“土地”开头的字符,以及后面的字符串,直到换行符才匹配完成这类模式串常用于匹配某些类型的字符,比如匹配文本中的所有汉字,我们可以将模式串写成'[\u4e00-\u9fa5]+',例如:pattern='[\u4e00-\u9fa5]+'message='公司名称:CDA数据科学研究所n邮箱:1918560461@qq.comn地址:北京市海淀区长洼街3号院2号楼2层网址:http://万维网。cda.cnn\企业名称:广州市学习在线科技有限公司n邮箱:981856661@qq.comn地址:广州市黄埔区虎林路1198号516室n网址:http://www.cda.cnn'findall=re.findall(pattern,message)print(findall)Out:['公司名称','数据科学研究所','邮箱','地址','北京市海淀区长洼街','编号','大厦','图层','URL','公司名称','广州雪雪在线科技有限公司','邮箱','地址','广州市黄埔区虎林路','编号','房间','URL']匹配文本中的所有数字,可以写成'[0-9]+',例如:pattern='[0-9]+'message='公司名称:CDADataScienceResearch研究所邮箱:1918560461@qq.comn地址:北京市海淀区长洼大街3号2号楼2层网址:http://www.cda.cnn\企业名称:广州学习在线科技有限公司.邮箱:981856661@qq.com地址:广州市黄埔区虎林路1198号516室n网址:http://www.cda.cng'findall=re.findall(pattern,message)print(findall)Out:['1918560461','3','2','2','981856661','1198','516']当然直接使用也是一样元字符“d”匹配所有数字:pattern='d+'message='公司名称:CDA数据科学研究所n邮箱:1918560461@qq.comn地址:北京市海淀区长洼街3号2号楼2层n网址:http://www.cda.cnn公司名称:广州市学习在线科技有限公司nEmail:981856661@qq.comn地址:广州市黄埔区虎林路119号8号516室nURL:http://www.cda.cnng'findall=re.findall(pattern,message)print(findall)Out:['1918560461','3','2','2','981856661','1198','516']又如匹配正文中所有小写英文字幕:pattern='[a-z]+'message='公司名称:CDA数据科学研究所nE-邮箱:1918560461@qq.comn地址:北京市海淀区长洼街3号2号楼2层网址:http://www.cda.cnn\企业名称:广州学习在线科技有限公司邮箱:981856661@qq.comn地址:广州市黄浦区虎林路1198号516室网址:http://www.cda.cnn'findall=re.findall(pattern,message)print(findall)Out:['qq','com','www','cda','cn','qq','com','www','cda','cn']这里总结一下常用的patternstrings:·如果匹配文本中所有的大写字符对于英文单词,模式字符串可以写成'[A-Z]+'·如果匹配文本中所有大小写的英文单词,则模式字符串patternstring可以写成'[aA-zZ]+'·如果匹配文本中所有大小写的英文单词words,numericstrings,patternstrings可以写成'[a0-z0-9A-Z]+'.更多行业干货会持续为您分享,您可以随时关注我们!(1)获取更多优质内容,可以前往:当前疫情有所缓和,也是提升自我、为未来蓄力的好时机——蓄势待发!(2)搜索CDA小程序,手机端随时随地浏览最新资讯和优质课程: