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

深入Python中的正则表达式

时间:2023-03-20 16:43:53 科技观察

正则表达式的应用场景也很多。常见的东西如:搜索引擎搜索、爬虫结果的匹配、文本数据的提取等都会用到,所以掌握甚至精通正则表达式是一项硬技能,也是非常必要的。正则表达式正则表达式是由普通字符和元字符组成的特殊字符序列。元字符可以帮助您轻松检查字符串是否与特定模式匹配。Python提供了一个强大的正则表达式处理模块,即re模块,它是Python的一个内置模块。下面给大家带来一个入门的demo例子,代码如下:是我们的普通字符,reg是我们的元字符。我们使用re模块中的findall函数进行匹配,返回结果为列表数据类型。我们使用正则表达式在一个很长的字符串中找到我们需要的字符串片段。元字符Python中常用的元字符及其含义如下:下面,我们使用Python中常用的元字符。我们还是用上一个例子,这次需要匹配我们在reg_string中的数字,只需将reg换成\d即可,代码如下图所示。比如我们在前面reg的hello前面加一个^,表示我们匹配字符串开头的hello,结果为1,就是我们的初始hello。如果我们把reg换成\w,代码如下图所示。这是为了匹配带下划线的数字和字母,包括我们的汉字。反义码Python中常见的反义码及其含义如下:其实记忆很简单,我们知道\d匹配数字吗,那么\d的大写\D匹配非数字,元字符[a]匹配任何字符a,然后[^a]匹配除a之外的任何字符。下面是具体的例子>>>importre>>>reg_string="hello9527python@wangcai.@!:xiaoqiang">>>reg="\D">>>re.findall(reg,reg_string)['h','e','l','l','o','p','y','t','h','o','n','@','w','a','n','g','c','a','i','.','@','!',':','x','i','a','o','q','i','a','n','g']>>>reg="[^a-p]"['9','5','2','7','y','','@','w','.','@','!',':','x','q']什么是限定词?就是限制我们匹配的东西的数量。Python中常见的限定符及其含义如下:我们还是使用我们之前的reg_string,这次我们将元字符限制为\d{4},也就是我们的匹配数必须是4。接下来我们来增加难度,匹配字母和数字,并将数字限制为4。这样,我们可以使用[0-9a-z]{4}作为我们的元字符,[0-9a-z]代表从0到9的十个数字和26个小写英文字母从A到Z。[0-9a-z]{4}将数字限制为4。让我们打印出来。如果不在[0-9a-z]范围内,则跳转,直到接下来的4个在[0-9a-z]范围内,打印出来。匹配ip地址在互联网中,一台主机只有一个IP地址。IP地址在TCP/IP通信协议中用来标示每台计算机的地址,通常用十进制表示,如192.168.1.100。在window系统中,我们可以通过ipconfig查看我们的ip。在linux系统中,我们可以通过ifconfig查看我们的ip。我们的ip字符串是这样的:ip="thisisip:192.168.1.123:172.138.2.15"下面需要使用正则表达式来匹配ip。其实我们主要是写元字符。例如:reg="\d{3}.\d+.\d+.\d+",因为第一个数字必须以三位数字开头,我们可以设置\d{3}来固定。除了使用findall,我们还可以使用search,我们把元字符reg="(\d{1,3}.){3}\d{1,3}"。这个元字符中的\d{1,3}指定了我们ip的前三个数字,后面加上{3}表示重复3次。\d{1,3}指的是我们ip的最后一个数字。但是search和findall是有区别的,search只能匹配第一个,我们需要用list来获取第一个,而findall匹配所有。群组匹配什么是群组匹配?例如,这里我有一个字符串s=thisisphone:13888888888andthisismypostcode:012345。我需要你将电话号码与验证码相匹配。因为,我们要匹配两个,但是每个元字符都是不同的。所以,我们需要组匹配。正则表达式中的括号表示组匹配,括号中的模式可以用来匹配组的内容。于是我们的元字符就变成了:reg=thisisphone:(\d{11})andthisismypostcode:(\d{6})我们一般都是用search来进行组匹配的,我上次说Search是不是需要去掉使用的是列表,和这里的组匹配是一样的,只不过这里用到了group()方法。group(1)代表我们的手机号,group(2)代表我们的验证码,group(0)代表我们的手机号和验证码,代码如下图所示。在正则表达式中,除了findall和search用法外,还有一个match用法。match的使用只匹配开头,同样需要通过group()取出,如下图match的例子。这就是re.I忽略大小写的意思。贪心和非贪心贪心和非贪心模式影响量词修饰的子表达式的匹配行为。贪心模式在整个表达式匹配成功的前提下尽可能匹配,而非贪心模式在整个表达式匹配成功的前提下尽可能少匹配。贪心和非贪心有几个非常重要的操作符。比如我这里有一个字符串reg_string=pythonnnnnnnnnpythonHelloPytho,我们首先在贪心模式下使用元字符:reg="python*"reg="python*"在贪心模式下,表示n重复零次或多次Second-rate。所以我们看到第一遍结果的pythonnnnnnnnn尽可能多的匹配。下面以非贪婪模式使用元字符:reg="python*?",reg="python+?",reg="python??"。reg="python*"在非贪婪模式下,表示n为零或一次,因此我们看不到pythonnnnnnnnn结果。手机号码验证首先我们要知道我们的手机号码是什么开头的?手机号码开头有16个数字:134、135、136、137、138、139、147、150、151、152、157、158、159、182、187、188。有7种中国联通手机号码开头的数字有:130、131、132、155、156、185、186。电信手机号码开头有4个数字:133、153、180、189。这样我们就可以在开头做事,先判断开头是否是上面的数字段,regex="^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\d{8}$",是我们的元字符,代码如下:importredefcheckCellphone(cellphone):regex="^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\d{8}$"result=re.findall(regex,cellphone)ifresult:print("匹配成功")returnTrueelse:print("匹配失败")returnFalsecellphone='13717378202'checkCellphone(cellphone)匹配成功true匹配邮箱合法next,我们进行一个作业,就是匹配我们的邮箱号码。赋值答案如下:importredefcheckEmail(email):regex_1='^(\w+)@sina.com$'regex_2='^(\w+)@sina.com.cn$'regex_3='^(\w+)@163.com$'regex_4='^(\w+)@126.com$'regex_5='^[1-9][0,9]{4,}+@qq.com$'regex=[regex_1,regex_2,正则表达式测试工具打开开源中国提供的正则表达式测试工具http://tool.oschina.net/regex/,输入需要匹配的文本,然后选择一个常用的正则表达式,得到对应的匹配结果。例如输入以下文字进行匹配:你好,我的电话号码是123455678,邮箱是runsen@qq.com,我的网站是https://blog.csdn.net/weixin_44510615。这个字符串包含一个电话号码和一个邮箱,然后尝试用正则表达式提取它,如图。选择网页右侧的“匹配邮箱地址”,即可在下方文字中看到邮箱地址。如果您选择“匹配网址URL”,您可以看到下面出现的文本中的URL。是不是很神奇?本文已收录GitHub,传送门~[1],还有完整的大厂面试考点,欢迎Star。