『娱乐思思话』Python正则表达式由浅入深(二)


『娱乐思思话』Python正则表达式由浅入深(二)
文章图片
在前面一篇文章中 , 我们主要讲解了re模块中比较简单的两种方法——re.match()与re.search() , 也讲解了元字符和限定符这两种在正则表达式中最常用的两类符号 。
但是这两种方法只能够在字符串中匹配出一个结果出来 , 如果要匹配多个呢?比如从下面的字符串中把所有的企业名称提取出来:
message='企业名称:CDA数据科学研究院n邮箱:1918560461@qq.comn地址:北京市海淀区厂洼街3号2号楼2-3层n网址: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层n网址:www.cda.cnn企业名称:广州就学在线科技有限公司n邮箱:981856661@qq.comn地址:广州市黄埔区护林路1198号516房n网址:www.cda.cn'
【『娱乐思思话』Python正则表达式由浅入深(二)】pattern='企业名称:.*'
re.findall(pattern,message)
Out:['企业名称:CDA数据科学研究院','企业名称:广州就学在线科技有限公司']
我们发现 , re.findall()把两个匹配成功的字符串都提取出来 , 作为列表的两个元素来返回 。
选择字符
如果我们既要提取企业名称 , 也要提取对应的邮箱 , 该怎么提取呢?有没有类似条件判断中的"or"选项?有的 , 这个时候可以使用选择字符"|" , 比如:
pattern='企业名称.*|邮箱.*'
message='企业名称:CDA数据科学研究院n邮箱:1918560461@qq.comn地址:北京市海淀区厂洼街3号2号楼2-3层n网址:www.cda.cnn企业名称:广州就学在线科技有限公司n邮箱:981856661@qq.comn地址:广州市黄埔区护林路1198号516房n网址:www.cda.cn'
findall=re.findall(pattern,message)
print(findall)
Out:['企业名称:CDA数据科学研究院','邮箱:1918560461@qq.com','企业名称:广州就学在线科技有限公司','邮箱:981856661@qq.com']
如此类推 , 如果想要将企业名称、邮箱、地址都一一提取到列表中 , 只需要在上面模式字符串后面再加上"|地址"即可:
pattern='企业名称.*|邮箱.*|地址.*'
message='企业名称:CDA数据科学研究院n邮箱:1918560461@qq.comn地址:北京市海淀区厂洼街3号2号楼2-3层n网址:www.cda.cnn企业名称:广州就学在线科技有限公司n邮箱:981856661@qq.comn地址:广州市黄埔区护林路1198号516房n网址:www.cda.cn'
findall=re.findall(pattern,message)
print(findall)
Out:['企业名称:CDA数据科学研究院','邮箱:1918560461@qq.com','地址:北京市海淀区厂洼街3号2号楼2-3层','企业名称:广州就学在线科技有限公司','邮箱:981856661@qq.com','地址:广州市黄埔区护林路1198号516房']
『娱乐思思话』Python正则表达式由浅入深(二)
文章图片
匹配某类字符
如果想要提取特定的字符 , 比如上面message中的"@"、":"、"." , 该如何单独提取出来?对于这种情况 , 用列表把你想要提取的字符放进去即可 , 比如下面的例子:
pattern='[@:.]'


推荐阅读