正则表达式详解
正则表达式(Regular Expression)
正则表达式你可以它当作是通配符的增强,它所作的事情就是帮你匹配指定规则的字符串,而且它在计算机的应用可能远比你想象得要多的多。
我们平时编辑器中的词法分析器会使用正则表达式去匹配代码中的关键字。网站上的注册表单会用到正则表达式去判断密码的复杂程度。在爬虫中,我们同样可以使用正则表达式提取我们需要的信息。
今天通过这样一篇文章给大家详细讲一下正则表达式的规则,让大家熟练掌握正则表达式的使用。
如果觉得这篇文章对你有帮助的话,欢迎大家点赞,收藏!
首先介绍一下今天要用到的工具:
为了测试你写的正则表达式,这里有很多种办法,我们可以使用编辑器内置的搜索工具,比如在vscode中点击这个图标
当然我们也可以在自己熟悉的编程语言中调用函数去测试它
这里我推荐一个在线的测试工具:regex101.com
我们首先看一下正则表达式中最基础的用法
//限定符(Quantifiers)
//1
这里的**?**在正则表达式中是一个特殊的字符,它是一个限定符,它代表前面这个字符d需要出现0次或者1次,说简单点就是d这个字符可有可无,可以看到我们用这个表达式可以去匹配use这个单词,同样也可以去匹配used.
//2
这里的*表示b可以没有,也可以出现很多次,可以看到它成功匹配了下面的ac,abc,和abbbbbbc,但是没有去匹配adc.
//3
这里的+,和*不同的是它会匹配出现【1】次以上的字符
//4
这里的{6}表示b出现6次,可以看到它成功匹配了下面的abbbbbbc.
这里{2,6}表示b出现的次数在2~6之间
如果希望出现的字符出现在2次以上,则可以省略6,直接写{2,}.
上面讲的是对单个字符进行操作,如果希望对多个字符进行操作,应该怎么办呢?
//5
可以将要匹配的字符括起来,然后在后面加限定符,可以看这个正则表达式成功匹配了多次ab的出现
//或 运算符(OR Operator)
//1
这里我们要去匹配a cat或者a dog,我们可以将正则表达式写成这样a (cat|dog),这里前面先去匹配a,后面括号的内容代表要么是cat,要么是dog,中间以竖线隔开,并且注意这里的括号是必不可少的,否则就成了要么事a cat,要么事dog
//字符类(Character Classes)
//1
比如想要匹配abc这几个字母构成的单词,我们可以写成[abc]+,方括号里的内容代表要求匹配的字符只能取自它们,另外我们可以在方括号里指定字符的范围
比如[a-z]代表所有小写的英文字符,[a-zA-Z]代表所有的英文字符,[a-zA-Z0-9]代表所有的英文字符和数字,如果在方括号的前面我们写一个尖号(^),则代表要求匹配除了尖号后面列出以外的字符
比如[^0-9]代表所有的非数字字符(包括换行符)
//元字符(Meto-characters)
\\d:数字字符
\\w:单词字符(英文、数字及下划线)
\\s:空白符(包括Tab和换行符)
\\D:非数字字符
\\W:非单词字符
\\S:非空白字符
.:任意字符(不包含换行符)
^:匹配行首
$:匹配行尾
//贪婪与懒惰匹配(Greedy vs Lazy Match)
假如我们要去匹配这个里面的标签,我们自然会想到这样的正则表达式<.+>,但这里可以看到这个表达式会直接把整个字符串都匹配了,原因是因为中间的这个.+会尽可能的匹配字符,我们知道.能代表任意字符,自然也会匹配>,因此才会有这样得结果,解决方法也很简单
我们在+右边加一个?就好了,它会将正则表达式中默认的贪婪匹配切换为懒惰匹配,这招在实际使用当中会经常用到
下面我们来看一些实例
//实例1:RGB 颜色值匹配
比如这里我们想要匹配文本中出现的所有十六进制RGB颜色值
我们首先去匹配前面的#,接下来由于每一个颜色的字符都是十六进制,因此它们只能取自a-f之间,或者大写的A-F或者0-9之间,并且字符一定需要出现6次,最后我们在表达式末尾加入\\b来代表单词字符的边界,这样可以避免最下面的#ffffffff也被识别RGB颜色值。
//实例2:IPV4地址匹配
IPv4的地址实际是由四段数字构成,数字之间由句点隔开,如果要在文本中提取所有的IP地址,我们可以直接使用\\d+.\\d+.\\d+.\\d+这个表达式
.代表.这个字面量,因为.在正则表达式是一个特殊符号,所以我们这里需要用反斜杠作转义,不过这里有个问题,我们知道IP地址的每个部分都是8位的数字,也就是说它的范围介于0-255之间,但是上面的256很显然超过了这个范围,但是还是被正则表达式匹配了,所以如果这里我们要做改良
我们可以使用下面这段逻辑,我们先来看IP地址被句点隔开的每一部分,如果它前面两位是25,那么最后一位只能取0-5之间的数字,如果它的第一位是2,第二位是0-4之间的数,那么最后一位可以取0-9之间的数字,这里用\\d表示,如果它第一位是0或者1,那么最后两位可以取00-99之间的任意数字,我们用\\d\\d表示,但是我们也知道IP地址的每一部分也可以由两位数字构成,甚至是一位,这样都是合法的,因此我们可以直接将这里的第一个数字和第三个数字后面都加一个?,就可以表示这种情况了,数字部分我们就匹配完了,接下来我们来匹配后面的句点,然后将全部表达式用括号括起来,这一段我们重复三次,这样正则表达式会取匹配IP地址的前三段,并且包含每一段后面的句点,至于最后面的一段数字我们只需要将第一段数字的这一部分复制过来即可,最后在首尾加入\\b来匹配字符的边界。
可以看到经过改良版的表达式可以成功匹配这里的三个IP地址,并且把不符合要求的排列在外
最后列了一张表,总结一下今天讲到的所有点
Python学习笔记 | 正则表达式详细解读
正则:是一个古汉语词汇,基本意思是正其礼仪法则,出自《楚辞·离骚》,英文regular。正则表达式:regular expression,简写regex,描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、 将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
正则表达式是计算机概念,各种语言都有正则表达式,之所以使用正则而不使用字符串的切片等基本操作,是因为正则表达式能够更简单地处理更复杂的字符串相关操作。例如,用正则表达式从获取到的网页元素中截取需要的网址信息,用来验证输入的电子邮件、QQ号、登录账号等在格式上是否正确等,简便易行。python里正则主要应用在爬虫方面。
现有一段蔬菜价格信息:
要求:将所有的价格(如3.78元/斤,7.16元/公斤)提取出来,并放置在一个列表中
第一种方法,使用字符串切片等常规方法来完成,代码如下:
第二种方法,使用正则表达式来完成,代码如下:
通过对比可以看到,正则表达式(不包括导入模块语句)只使用了一条语句就实现了常规方法18条语句的功能,并且条理清晰、易于理解!
第一步:导入正则模块re,python从1.5版本开始增加了正则re模块,使用前需要先导入。
格式:import re
第二步:通过re模块的compile编译函数,创建一个正则模型(pattern),也就是使用正则表达式书写一个子串的构成格式。正则表达式由元字符(字符串里的基本字符)和特殊字符组成,可以都是元字符,也可以都是特殊字符,根据需要自行组合。
格式:pattern = re.compile(正则表达式)
第三步:通过模型pattern的match函数返回一个匹配对象
格式:match_obj = pattern.match(字符串)
第四步:通过匹配对象的组群方法得到匹配出来的子串
格式:substr = match_obj.group()
实例代码如下:
以上是正则的基本流程,实际上re直接封装了match函数,写法非常简单,代码如下:
match函数的特点是从字符串的首个字符开始匹配,如果给出的子串不在字符串开头位置,得到的对象即为空,后面介绍其它函数可以解决这个问题,实例代码如下:
以上介绍的正则表达式都是由元字符构成的,没有特殊字符,下面就开始介绍真正的正则表达式!
正则表达式的特殊字符称为预定义字符,常用预定义字符 如下:
1、普通字符集
2、数量字符集
用在字符或分组符(…)之后,默认贪婪匹配,如果想抑制贪婪匹配,需在数量字符后加?,例如:\\w+?
3、边界匹配符
4、逻辑匹配符
5.特殊匹配符
实例说明,代码如下:
1、验Q号是否符合规则
2、验证用户名是否符合规则
3、验证手机号码是否符合规则
4、验证固定电话号码是否符合规则
5、提取一句话中的所有单词
6、匹配邮箱
7、手机号码筛选
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。