正则表达式详解

正则表达式(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地址,并且把不符合要求的排列在外

最后列了一张表,总结一下今天讲到的所有点
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值