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

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

时间:2023-03-25 22:42:37 Python

CDA数据分析师在数据分析工作中产生很多与文本处理相关的任务,比如从文本中提取客户信息,从文本中提取时间等都是比较常见的操作。虽然Python有很多处理字符串的方法,流行的pandas库也提供了大量向量化字符串的方法,但是当涉及到需要比较复杂的数据匹配的字符操作时,这些方法就很无力了。特别是由于文本数据来自爬虫等渠道,数据往往严重不规则,此时对文本的处理难度就特别大。好在Python提供了re模块,可以实现正则表达式的操作。re模块主要通过六个方法处理字符串,包括:match()、search()、findall()、split()、sub()。这些方法涉及字符串匹配和替换等操作。在接下来的四篇连载文章中,我们不仅会讲解这四种方法,还包括元字符、行定位符、限定符、字符类和排除项。字符、选择字符、转义字符、分组等正则表达式最常用的知识点贯穿始终。下面的系列文章将为大家初步搭建一个比较完整的Python正则表达式知识体系。如果你已经学完了Python编程基础和数据清洗的课程知识,本系列文章将让你使用Python正则表达式来实现一学就会,一用就懂,从而达到目的真正的掌握。re.match方法让我们首先看一下re模块中更简单的match()方法。match的作用是使用Pattern实例从字符串的左边开始匹配。如果匹配,则返回一个Match实例。如果第一个字符不满足条件,则返回None。其语法格式如下:re.match(pattern,string,[flags])·pattern:表示模式字符串,由待匹配的正则表达式转换而来。·string:表示要匹配的字符串。·flags:可选参数,表示标志位,后面会讲到这个参数。模式字符串是什么意思?先看下面的例子:pattern='公司名称'message='公司名称:CDA数据科学研究所'match=re.match(pattern,message)matchOut:这个时候我们发现re.match()方法返回了一个re.match对象,但是这个对象中的信息是什么意思呢?在上面的示例中,我们的模式字符串没有使用任何其他特殊字符,只是“公司名称”。字符串消息的前几串恰好是“公司名称”,所以返回的re.match对象可以解释如下信息:“公司名称”的字符串可以索引区间span(0,4)中的匹配,匹配结果为match='公司名称'此外,re.match对象还可以通过调用.start()方法和.end()方法获取匹配值的起止位置:match.start()match.end()也可以使用.span()方法获取记录匹配字符位置索引的元组:match.span()Out:(0,4)可以将消息中的匹配字符串传过去。group()方法获取:match.group()Out:'CompanyName'匹配的字符串可以通过re.match对象的string属性调用:match.stringOut:'CompanyName:CDADataScienceResearchInstitute're.search方法如果说要匹配的字符串没有出现在消息的开头,而是出现在中间,match()方法无法匹配它。这时候就可以使用re.search()方法了。比如我们要匹配消息中的“CDA数据科学研究所”,我们将pattern指向的对象改为“企业名称”,调用re.search()方法:pattern='CDA数据科学研究院'message='公司名称:CDA数据科学研究所'search=re.search(pattern,message)searchOut:值得注意的是,re.search()方法返回的结果也是一个re.match对象,所以这个类型的方法和属性也可以调用上面提到的对象。search.start()search.end()search.span()search.group()search.stringOut:515(5,15)'CDA数据科学研究所''公司名称:CDA数据科学研究所'MetaCharacterOK,我们继续思考,如果我们要匹配消息中“CDA”之后的一个字符,那么pattern应该怎么写呢?pattern='CDA.'message='企业名称:CDA数据科学研究所n邮箱:1918560461@qq.com'search=re.search(pattern,message)searchOut:通过上面的例子,我们会发现消息中字符串“CDA”后面的“number”也被匹配到了。这个只需要在设置模式的时候在字符串“CDA”后面加一个点,这个点的作用就是帮你匹配除换行符之外的任意字符。另外,我们也可以把圆点换成“w”,最后的效果是一样的:search(pattern,message)searchOut:<重新匹配对象;span=(5,9),match='CDAnumber'>"w"是帮你匹配字符,数字,下划线或者汉字。这些符号称为元字符。除了点号和“w”之外,还有以下元字符:这里需要注意的是,由于大多数元字符都包含特殊字符和反斜杠,为了匹配原生字符串,可以在元字符前加上r或R,如:pattern=r'bCDA.{5}'#元字符前加rmessage='公司名称:CDA数据科学研究所,CDA数据分析师,邮箱:1918560461@qq.com'search=re.search(pattern,message)print(search)Out:在上面的例子中,我们还需要注意的是,由于模式字符串中的元字符“b”,“b”匹配一个分隔符(空格、标点符号或换行符)。因此,由于messgae中左起第一个“CDA”字符串前没有定界符,最终匹配的是第二个“CDA”字符串。那么上面模式字符串中出现的花括号“{}”是什么意思呢?这是我们接下来要解释的限定符。元字符是在限定符之前学习的,我们可以通过re.match()方法和re.search()方法进行非常灵活的字符匹配。但是还有很多地方不能只用元字符来解决。比如我们要匹配字符串'CompanyName:CDADataScienceResearchInstitutenEmail:1918560461@qq.com'中的邮箱,怎么办?这时候我们可以给pattern字符串加上限定符:pattern='Email:.{17}'message='Email:1918560461@qq.com'search=re.search(pattern,message)print(search)Out:<重新匹配对象;span=(15,35),match='Email:1918560461@qq.com'>上面patrern参数设置的原理是:既然是为了match输出消息中的邮箱信息,邮箱信息在后面消息中的字符串“邮箱:”。如果邮箱信息的长度为1,则pattern可以写成“mailbox:.”。但是,邮箱信息的长度是17个字符。也就是说,要匹配邮件中“email:”后的17个字符,在上述模式后加上限定符“{17}”即可匹配17个字符(不包括换行符)。但是如果邮箱消息长度不是17呢?由于邮件信息是从邮件中字符串“mailbox:”的末尾开始的,我们可以这样写:pattern='mailbox:.*'message='Email:1918560461@qq.com'search=re.search(pattern,message)print(search)Out:除了上面提到的“{n}”和“*”之外,还有哪些常用的限定符呢?这里需要提醒大家的是,由于元字符“.”匹配除换行符以外的任意字符,即使我们的邮件中邮箱信息后面有换行符,上面的方法依然可以匹配到邮箱信息。例如:pattern='Email:.*'message='企业名称:CDA数据科学研究所nEmail:1918560461@qq.comn地址:北京市海淀区长洼街3号院2号楼2-3层网址:www.cda.cn'search=re.search(pattern,message)print(search)Out:但是,如果上面消息中的“address”这个词前面没有换行符“n”呢?如何匹配邮箱信息?我们只需要在模式中的星号后面加上邮箱地址的最后一个字符“com”作为匹配结束:pattern='email:.*com'message='公司名称:CDA数据科学研究所nEmail:1918560461@qq.com地址:北京市海淀区长洼街3号院2号楼2-3层网址:www.cda.cn'search=re.search(pattern,message)print(search)Out:更多行业干货会持续为大家分享,大家可以随时关注!(1)获取更多优质内容,可以前往:当前疫情有所缓和,也是提升自己的好时机。未来储能-蓄势待发!(2)搜索CDA小程序,手机端随时随地浏览最新资讯和优质课程: