当前位置: 首页 > 科技观察

整理了几个Python正则表达式,带走就可以用!

时间:2023-03-16 16:42:42 科技观察

正则表达式可用于搜索、编辑和操作文本。PythonRegEx被几乎所有公司广泛使用,并且对其应用程序具有良好的行业牵引力,使得正则表达式越来越重要。今天我们就一起学习Python正则表达式。为什么要使用正则表达式。要回答这个问题,我们先来看看我们面临的各种问题,而这些问题又可以通过使用正则表达式来解决。考虑以下场景:在文章的最后,有一个包含大量数据的日志文件。从这个日志文件中,您只想获取日期和时间。乍一看,日志文件的可读性很低。在这种情况下,正则表达式可用于识别模式并轻松提取所需信息。考虑下一个场景:你是一名销售人员,有很多电子邮件地址,其中很多是假的/无效的,请看下图:我们可以做的是使用正则表达式,可以验证电子邮件地址的格式并从中过滤掉假ID真实身份证。下一个场景与销售员示例非常相似,考虑下图:我们如何验证电话号码,然后按来源国对其进行分类?每个正确的数字都会有一个特定的模式,可以使用正则表达式进行跟踪和追踪。接下来是另一个简单的场景:我们有一个学生数据库,其中包含姓名、年龄和地址等详细信息。考虑区号最初是59006但现在已更改为59076的情况,为每个学生手动更新此代码将是一个耗时且漫长的过程。基本上,为了使用正则表达式解决这些问题,我们首先从包含pincode的学生数据中找到一个特定的字符串,然后将它们全部替换为新字符串。什么是正则表达式?正则表达式用于识别文本字符串中的搜索模式。它还有助于找出数据的正确性。您甚至可以使用正则表达式来查找、替换和格式化数据。考虑以下示例:在给定字符串的所有数据中,假设我们只想要城市,这可以以格式化的方式转换为仅包含名称和城市的字典。现在的问题是,我们能否确定一种猜测名称和城市的模式?我们也可以查出年龄,随着年龄的增长,这很容易,对吧?它只是一个整数。我们用这个名字做什么?如果您查看架构,所有名称都以大写字母开头。在正则表达式的帮助下,我们可以使用这种方法来识别姓名和年龄。我们可以使用下面的代码importreNameage='''Janiceis22andTheonis33Gabrielis44andJoeyis21'''ages=re.findall(r'd{1,3}',Nameage)names=re.findall(r'[A-Z][a-z]*',Nameage)ageDict={}x=0foreachnameinnamesageDict[eachname]=ages[x]x+=1print(ageDict)Output:{'Janice':'22','Theon':'33','Gabriel':'44','Joey':'21'}一些正则表达式的例子:正则表达式可以做很多事情。在这里,我列出了一些非常重要的东西,以帮助更好地理解正则表达式的用法。我们先看看如何在字符串中查找特定的单词Findawordinastringimportreifre.search("inform","weneedtoinformhimwiththelatestinformation"):print("Thereisinform")All我们在这里做的是搜索以查看我们的搜索字符串中是否存在单词inform。当然我们也可以优化下面的代码importreallinform=re.findall("inform","我们需要通知他最新的信息!")foriinallinform:print(i)这里,在这种特殊情况下,会找到infor两次。一个来自通知,另一个来自信息。在正则表达式中查找单词就是这么简单,如上所示。接下来我们将看到如何使用正则表达式生成迭代器。生成迭代器生成迭代器是一个简单的查找和定位字符串开始和结束索引的过程。考虑以下示例:importreStr="weneedtoinformhimwiththelatestinformation"foriinre.finditer("inform.",StrlocTuple=i.span()print(locTuple)对于找到的每个匹配项,两者都开始和结束索引被打印。当我们执行上面的程序时,输出如下:(11,18)(38,45)接下来我们将研究如何使用正则表达式将单词与模式匹配。将单词与模式匹配考虑一个输入我们必须匹配特定单词的字符串。详细说明,请参见以下示例代码:importreStr="Sat,hat,mat,pat"allStr=re.findall("[shmp]at",Str)foriinallStr:print(i)Whatiscommoninthestrings?可以看到字母“a”和“t”在所有输入的字符串中都是通用的,代码中的[shmp]表示查找单词的第一个字母,所以任何以字母s、h、m或p开头的子字符串都将被视为匹配项,其中任何一个,并且必须在末尾后跟“at”。输出:hatmatpat接下来我们将研究如何使用正则一次匹配一系列字符的表达式。为了匹配一系列字符,我们希望输出首字母应在h和m之间且必须后跟at的所有单词。看下面的例子,我们应该得到TheoutputishatandmatimportreStr="sat,hat,mat,pat"someStr=re.findall("[h-m]at",Str)foriinsomeStr:print(i)输出:hatmat现在让我们稍微改变一下上面的程序以获得不同的结果print(i)发现了细微差别?,我们在正则表达式中添加了一个插入符号(^),它的效果否定了它后面的任何效果。我们不会为从h到m的所有内容提供输出,而是向我们展示其他所有内容的输出。我们可以预期的输出是不以h和m之间的字母开头但仍跟在末尾的单词。输出:satpat替换字符串:接下来,我们可以使用正则表达式来检查另一个操作,我们将字符串中的一项替换为其他内容:importreFood="hatratmatpat"regex=re.compile("[r]at")Food=regex.sub("food",Food)print(Food)在上面的示例中,单词rat被替换为单词food。利用这种情况的正则表达式替代方案也有多种实际用例。输出:hatfoodmatpatBackslashproblemimportrerandstr="HereisEdureka"print(randstr)输出:HereisEdureka这是反斜杠问题,其中一个斜杠从输出中消失了,这个特殊问题可以使用正则表达式来解决。importrerandstr="HereisEdureka"print(re.search(r"Edureka",randstr))输出:这是使用正则表达式解决反斜杠问题的简单方法。匹配单个字符使用正则表达式很容易匹配字符串中的单个字符importrerandstr="12345"print("Matches:",len(re.findall("d{5}",randstr)))输出:匹配:1去除换行符我们可以在Python中使用正则表达式轻松去除换行符,randstr)print(randstr)Output:YouNeverWalkAloneLiverpoolFCYouNeverWalkAloneLiverpoolFC从上面的输出可以看出,新的行已经被空格替换,输出打印在一行上。可以使用许多其他的东西,这取决于你想用什么来替换字符串:Backspace:Formfeed:CarriageReturn:Tab:VerticalTab你可以使用像这样的东西importrerandstr="12345"print("Matches:",len(re.findall("d",randstr)))Output:Matches:5从上面的输出可以看出,d匹配字符串中存在的整数。但是,如果我们用D替换它,它将匹配除整数以外的所有内容,与d完全相反。接下来我们看一些在Python中使用正则表达式的重要实例。正则表达式的实际示例我们将检查最广泛使用的3个主要用例电话号码验证电子邮件地址验证网络抓取电话号码验证需要在任何相关场景中轻松验证电话号码考虑以下电话号码:444-122-1234123-122-78999111-123-2367-7890-2019电话号码的一般格式如下:3位数字开头带“-”号3位中间数字和一个“-”号最后4位数字我们将在w下面的例子,请注意w=[a-zA-Z0-9_]importrephn="412-555-1212"ifre.search("w{3}-w{3}-w{4}",phn):print("Validphonenumber")Output:ValidphonenumberEmailValidation在任何情况下验证电子邮件地址的有效性。考虑以下电子邮件地址示例:Anirudh@gmail.comAnirudh@comAC.com123@.com我们可以一眼就从无效的邮件ID中识别出有效的邮件ID,但是当我们的程序为我们做这件事时,做事情并不那么容易,但是使用正则表达式,就很简单了。作为指导原则,所有电子邮件地址都应包含:1到20个小写和/或大写字母、数字和._%+一个@符号2到20个小写和大写字母、数字和一个加号2到3个小写和大写importreemail="ac@aol.commd@.com@seo.comdc@.com"print("电子邮件匹配:",len(re.findall("[w._%+-]{1,20}@[w.-]{2,20}.[A-Za-z]{2,3}",email)))Output:EmailMatches:1从上面的输出中,我们可以看到我们输入的4个电子邮件中的一个是有效的。这基本上演示了采用正则表达式并实际使用它们是多么容易和高效。网络抓取从网站上删除所有电话号码以满足需求。要了解网络抓取,请看下图:我们已经知道一个网站将由多个网页组成,我们需要从这些页面中抓取一些信息。网页抓取主要用于从网站中提取信息,提取的信息可以以XML、CSV甚至MySQL数据库的形式保存,使用Python正则表达式可以轻松实现。导入urllib.requestfrom重新导入findallurl="http://www.summet.com/dmsi/html/codesamples/addresses.html"response=urllib.request.urlopen(url)html=response.read()htmlStr=html。decode()pdata=findall("(d{3})d{3}-d{4}",htmlStr)foriteminpdata:print(item)Output:(257)563-7401(372)587-2335(786)713-8616(793)151-6230(492)709-6392(654)393-5734(404)960-3807(314)244-6306(947)278-5929(684)579-1879(389))737-2852...我们首先导入执行网络抓取所需的包,最终结果包括使用正则表达式完成网络抓取后提取的电话号码。