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

代码解释:使用Python正则表达式的优秀指南

时间:2023-03-13 04:09:26 科技观察

处理文本数据的主要任务之一是创建许多基于文本的特征。人们可能想要在文本中查找特定格式,例如在文本中查找电子邮件或在大文本中查找电话号码。虽然执行上述操作听起来很乏味,但使用Python正则表达式模块可以使它变得容易得多。假设您想找出特定段落中标点符号的数量。以狄更斯作品的文本为例。你通常是怎么做的?最简单的方法如下:,我们之前什么都没有,我们都直接去天堂,我们都直接去另一个方向——简而言之,这个时期和现在的时期很相似,一些最吵闹的当局坚持要接收它,不管是好是坏,只在最高级的比较中。”num_points=0num_puncts=0forpunctintarget:ifpunctinstring:num_puncts+=puncts-print---string.count(puncts)---string-count(punct)---------------------------------------------------19如果没有re模块供您使用,则使用上面的代码。但是如果有re模块,只需要两行代码:importrepattern=r"[;.,–]"print(len(re.findall(pattern,string)))--------------------------------------------------------------19本文讨论最常用的正则表达式模式,以及一些常用的正则表达式函数。什么是正则表达式?简而言之,正则表达式(regex)用于探索给定字符串中的固定模式。我们想要找到的模式可以是任何东西。可以创建类似于查找电子邮件或手机号码的模式。您还可以创建模式来查找以a开头并以z结尾的字符串。在上面的例子中:importrepattern=r'[,;.,–]'print(len(re.findall(pattern,string)))我们要找的模式是r'[,;.,–]'。此模式可找到您想要的4个字符中的任何一个。regex101是一个测试模式的工具。将模式应用于目标字符串时,会出现以下界面。如图,在目标字符串中可以根据需要找到,;.,–。每当您需要测试正则表达式时,您都会使用上述工具。这比一遍又一遍地运行python更快更容易调试。现在我们可以在目标字符串中找到这些模式,我们如何实际创建这些模式呢?使用正则表达式创建模式时,首先需要学习的是如何创建模式。接下来,将对一些最常用的模式进行一一介绍。可以想象的最简单的模式是一个简单的字符串。pattern=r'times'string="这是最好的时代,也是最坏的时代。"print(len(re.findall(pattern,string)))但这不是很有用。为了帮助创建复杂的模式,正则表达式提供了特殊的字符/运算符。让我们一一看看这些运算符。请等待gif加载。1.第一个例子中使用的[]运算符可用于在这些方括号中查找满足条件的字符。[abc]-将查找文本中所有出现的a、b或c[a-z]-将查找文本中出现的从a到z的所有字母[a-z0–9A-Z]-将查找所有出现的文本从A到Z的大写字母,从a到z的小写字母,以及从0到9的数字。下面的代码可以很容易地在Python中运行:pattern=r'[a-zA-Z]'string="Itwasthebestoftimes,这是最糟糕的时代。”print(len(re.findall(pattern,string)))除了.findall,正则表达式还有很多其他的功能,后面会讲到。2.点运算符点运算符(.)用于匹配换行符以外的任何字符。运算符的伟大之处在于它们可以结合使用。例如,您想要在包含6个字母的字符串中查找以小写d或大写D开头并以字母e结尾的子字符串。3.一些元序列在使用正则表达式时,往往会用到一些模式。所以正则表达式为这些模式创建了一些快捷方式。最常用的快捷键如下:\w,匹配任意字母、数字或下划线。等同于[a-zA-Z0–9_]\W,匹配除字母、数字或下划线以外的任何内容。\d,匹配任何十进制数字。相当于[0–9]。\D,匹配除十进制数字之外的任何数字。4.加号和星号运算符点号运算符仅用于获取任何字符的单个实例。如果你想找到更多的实例怎么办?加号+用于指示最左边字符的一个或多个实例。星号*用于指示最左边字符的0个或多个实例。例如,要查找所有以d开头,以e结尾的子串,d和e之间可以没有字符,也可以有多个字符。我们可以使用:d\w*e如果我们想找到所有以d开头,以e结尾,并且d和e之间至少有一个字符的子串,我们可以使用:d\w+e也可以使用更多对于一般用途:使用{}\w{n}-精确重复\wn次。\w{n,}-重复\w至少n次或更多次。\w{n1,n2}-重复\w至少n1次,但不超过n2次。5.^插入符号和$美元符号。^插入符匹配字符串的开头,$美元符号匹配字符串的结尾。6.单词边界这是一个重要的概念。您是否注意到在上面的示例中,总是匹配子字符串,而不是单词?如果你想找到所有以d开头的单词怎么办?你能使用d\w*模式吗?让我们用一个网络工具试试看吧。正则表达式函数到目前为止,只用到了re包中的findall函数。其实还有很多其他的功能。让我们一一介绍。1.findall上面已经使用了findall。这是我最常使用的。下面让我们正式认识一下这个函数。输入:模式和测试字符串输出:字符串列表。#USAGE:pattern=r'[iI]t'string="这是最好的时代,也是最坏的时代。"比赛=重新。匹配中的findall(pattern,string)格式:print(match)--------------------------------------------------------Itit2。搜索输入:模式和测试字符串输出:第一个匹配项的位置对象。#USAGE:pattern=r'[iI]t'string="Itwasthebestoftimes,itwastheworstoftimes."location=re.search(pattern,string)print(location)----------------------------------------------------------<_sre.SRE_Matchobject;span=(0,2),match='It'>可以使用下面的编程方式获取location对象的数据:print(location.group())------------------------------------------------------------'它'3.替换这个函数也很重要。在使用自然语言处理程序时,有时您需要用X替换整数,或者您可能需要编辑一些文件。在任何文本编辑器中查找和替换都可以解决问题。输入:搜索模式、替换模式和目标字符串输出:替换字符串string="Itwasthebestoftimes,itwastheworstoftimes."string=re.sub(r'times',r'life',string)print(string)---------------------------------------------------------这是最好的生活,也是最坏的生活。案例研究正则表达式用于许多需要验证的情况。我们可能会在网站上看到类似这样的内容:“这不是一个有效的电子邮件地址”。虽然可以使用多个if和else条件来编写这样的提示,但正则表达式可能更有利。1.PAN号在美国,SSN(SocialSecurityNumber)是用于税务识别的号码,而在印度,PAN号用于税务识别。PAN的基本验证标准是:上面的所有字母必须大写,字符顺序如下:那么问题是:“ABcDE1234L”是一个有效的PAN号吗?如果没有正则表达式,这怎么能回答呢?大概写一个for循环,和一个遍历查找。但是使用正则表达式,它就像这样简单:match=re.search(r'[A-Z]{5}[0–9]{4}[A-Z]','ABcDE1234L')ifmatch:print(True)else:print(错误的)------------------------------------------错误2。查找域名有时我们必须从一个巨大的文本文档中查找电话号码、电子邮件地址或域名等。例如,假设有以下文本:^["Train(noun)"](http://www.askoxford.com/concise_oed/train?view=uk).(定义–CompactOED).OxfordUniversityPress.Retrieved2008-03-18.^Atchison,TopekaandSantaFeRailway(1948).Rules:OperatingDepartment.p.7.^[Hydrogentrains](http://www.hydrogencarsnow.com/blog2/index.php/hydrogen-vehicles/i-hear-the-hydrogen-train-a-comin-its-rolling-round-the-bend/)^[VehicleProjectsInc.Fuelcelllocomotive](http://www.bnsf.com/media/news/articles/2008/01/2008-01-09a.html)^CentralJapanRailway(2006).CentralJapanRailwayDataBook2006.p.16.^["OverviewOftheexistingMumbaiSuburbanRailway"](http://web.archive.org/web/20080620033027/http://www.mrvc.indianrail.gov.in/overview.htm)._OfficialwebpageofMumbaiRailwayVikasCorporation_.Archivedfrom[theoriginal](http://www.mrvc.indianrail.gov.in/overview.htm)on2008-06-20.Retrieved2008-12-11.

需要从上面的文字中找到这里所有的域名-askoxford.com;bnsf.com;hydrogencarsnow.com;mrvc.indianrail.gov.in;web.archive.org做什么?match=re.findall(r'http(s:|:)\/\/(www.|ww2.|)([0-9a-z.A-Z-]*\.\w{2,3})',string)foreleminmatch:print(elem)------------------------------------------------------------------(':','www.','askoxford.com')(':','www.','hydrogencarsnow.com')(':','www.','bnsf.com')(':','','web.archive.org')(':','www.','mrvc.indianrail.gov.in')(':','www.','mrvc.indianrail.gov.in')这里使用or运算符,match返回一个元组,()中的pattern部分保留3.查找邮件地址:下面的正则表达式用于在长文本中查找邮件地址match=re.findall(r'([\w0-9-._]+@[\w0-9-.]+[\w0-9]{2,3})',string)这些是高级示例,提供了足够的信息来帮助您获得例子结论虽然正则表达式看起来很吓人,但它们非常灵活用于操作数据、创建特征和寻找模式。