快速掌握正则表达式
文章目录
- 限定符 Qualifier
- 第一个常用限定符 ?
- 第二个常用限定符 *
- 第三个常用限定符 +
- 或运算符
- 字符类
- 元字符 Meta-characters
- \d 数字字符
- \w 单词字符
- 空白符 `\s`
- `.`任意字符
- `^` `$` 行首行尾
- 贪婪与懒惰匹配 Greedy vs Lazy Match
- 实例 1 :RGB颜色匹配
- 实例 2 :IPv4地址匹配
- 总结
正则表达式,你可以把它当做是通配符的增强版,它所做的事情呢,就是去帮你匹配指定规则的字符串,而且它在计算机中的应用可能远比你想象的要多得多。
我们平时编译器中的词法分析器会使用正则表达式去匹配代码中的关键字,网站上注册表单或用到正则表达式去判断密码的复杂程度。在爬虫中,我们同样可以使用正则表达式。提取我们需要的信息,
那我们先来介绍一下,今天要用到的一些工具,为了测试你写的正则表达式呢,这里有很多种办法,我们可以使用编辑器内置的搜索工具。比如,在VS code搜索框的最右边,我们可以点选这个图标,
使用正则表达式去搜索字符串。
当然,我们也可以在自己熟悉的编程语言中调用函数去测试它。不过这里我推荐一个在线的测试工具,下面是你要测试的文本,上面是正则表达式。左边可以选择正则表达式,在不同语言下的变体,右边是一些帮助信息和参考文档,这里我们随便粘贴一段文字来测试一下,如果我们在上方输入任意表达式。被成功匹配的文本则会以高亮的形式显示出来,那么首先来看一下正则表达式中最基础的用法。
限定符 Qualifier
第一个常用限定符 ?
我们现在上方输入我们的第一个正则表达式,** 这里的问号呢?在正则表达式中是一个特殊的字符,它是一个限定符,它代表前面的这个字符d需要出现零次或者一次。 ** 说简单点就是d这个字符可有可无,可以看到我们用这个表达式呢,可以去匹配use这个单词,同样可以去匹配used。
第二个常用限定符 *
第二个常用到的限定符是星号,它会去匹配零个或者多个字符,比如这里我们输入AB星号c。
星号在这里代表b可以没有,也可以出现多次,那可以看到它成功匹配了下面的ac abc abbbc,但是没有去匹配adc。因为我们表达式中明确规定了a和c中间只能出现零个或者多个b。
第三个常用限定符 +
第三个限定符,是我们这里的加号(+)和星号(*)不同的是它会匹配出现一次以上的字符 。如果我们把这里的星号改成加号,可以看到第一个ac就没有被成功匹配了。
如果我们要做到更精确的匹配,比如我们要指定这个。里b出现的次数为六次,我们可以使用花括号,比如这里在花括号里面写上六。
那使用花括号呢,同时允许我们输入一个范围。比如,我们希望字符出现的次数为2到6之间,我们可以写成花括号二,逗号六。
如果我们希望字符出现的次数为两次以上。我们可以直接省略这里的这个六。
那所有的限定符在这里就讲完了,不过之前限定符的对象是一个字符。如果我们希望去匹配多个字符的重复,那么应该怎么办呢?比如在这个例子中,我们想去匹配中间多次出现的这个ab。我们可以先将ab用括号括起来,然后再在后面添加限定符,可以看到这个正则表达式成功匹配了这里多次ab的出现。
接下来我们来看一下正则表达式中的或运算符。
或运算符
比如这里我们要去匹配a cat或者a dog,我们可以将正则表达式写成这样,那这里前面呢?
会先去匹配a空格,后面括号中内容代表,要么是cat,要么是dog,中间以竖线隔开,并且注意这里的括号是必不可少的,否则就变成了要么是a cat,要么是dog。
字符类
那另一个与运算符相关的是字符类,比如我们想要匹配由ABC这几个字母构成的单词,我们可以写作方括号ABC([abc]
),方括号里的内容呢?代表要求匹配的字符只能取自于它们,另外我们可以在方括号里指定字符的范围,比如a杠z([a-z]
)代表所有的小写英文字符,那大写的a杠z([A-Z]
)代表所有的大写英文字符。
[a-zA-Z0-9]
代表所有的英文字符和数字。
如果在方括号的前面,我们写一个尖号,则代表要求匹配,除了尖号,后面列出的以外的字符,比如[^0-9]
。代表所有的非数字字符,但这里面包含换行符。
元字符 Meta-characters
\d 数字字符
另外正则表达式中其实为我们预先定义好了一系列常用的字符类型,比如数字、空白符、单词开头结尾等等。它们被称作元字符。这个表达式中的大多数元字符都是以反斜杠开头。\d
代表数字字符。等同于之前写的[0-9]
。
\w 单词字符
\w
代表单词字符,也就是所有的英文字符、数字,加上下划线。
空白符 \s
\s
代表空白符,它同时包含tab字符以及换行符。这个需要注意一下。
另外,与\d
相对应的,大写的\D
代表非数字字符。与\w
相对应的,大写的\W
代表非单次字符。与\s
相对应的,大写的\S
代表非空白字符
.
任意字符
句点呢?在正则表达式中也是一个特殊的字符,它代表任意字符,但不包含换行符。
^
$
行首行尾
另外,这里呢,还有两个特殊的字符,间号(^
)呢,会去匹配行首,美元符号($
)会去匹配行尾,比如尖号a(^a
)只会去匹配行首的A。A美元符号(a$
)只会去匹配行尾的a。
贪婪与懒惰匹配 Greedy vs Lazy Match
接下来我们来介绍一下正则表达式中的一些高级概念。
那之前我们讲到的星号(*
)、加号(+
),花括号({}
)在匹配字符串的时候默认会去匹配尽可能多的字符,比如在下面的例子中,我们想去匹配这里面的HTML标签,比如这里的<span>
和<b>
。我们自然会想到这样的正则表达式,但这里可以看到,这个正则表达式会直接把整个字符串都全部匹配了,原因是因为中间的这个点加号会匹配尽可能多的字符。
我们知道点能代表任意字符。自然也会匹配右尖括号(>
),因此才会有这样的结果,但是解决方法也很简单,我们只需要在加号右边加一个问号(?
)就好了,它会将正则表达式中默认的贪婪匹配(Greedy Match)切换为懒惰匹配(Lazy Match),这招在实际使用中也会经常被用到。
实例 1 :RGB颜色匹配
比如这里我们想要匹配文本中出现的所有16进制的rgb颜色值。我们可以首先去匹配前面的井号,那接下来呢,因为代表每一个颜色值的字符都是16进制,因此它们只能取自于a到f之间或者大写的A到F或者0到9之间。并且字符一定需要出现六次。
最后我们可以在表达式末尾加入杠b(\b
)来代表单词字符的边界。这样可以避免这里不符合要求的文本也被识别成rgb颜色值。
实例 2 :IPv4地址匹配
在第二个例子中,我们来讲一下IP地址的匹配IPV 4的地址呢,实际上是由四段数字构成,数字之间由据点隔开。如果要在文本中提取所有出现的IP地址,我们可以直接使用下面这种正则表达式杠d(\d
)加号会匹配任何长度大于一的数字。杠句点(\.
)代表句点这个字面量,因为句点在正则表达式中是一个特殊的符号,所以我们需要在这里用反斜杠做转义。
可以看到,这里正在表达式也成功的帮我们匹配了这四个结果。不过,这里有一个问题,我们知道IP地址的每一部分都是八位的数字。也就是说,它的范围介于0到255之间,但这里的这个数字显然已经超出了范围,但是还是被正则表达式成功匹配了。
所以如果这里我们要做改良的话呢,我们可以使用下面这段逻辑,我们先来看IP地址被句点隔开的每一部分。
- 如果它的前两位是二五,那么最后一位只能取0到5之间的数字;
- 如果它的第一位是二,第二位是0到4之间的数,那么最后一位可以取0到9之间的任意值。这里用杠d代替;
- 如果它第一位是零或者一,那么最后两位可以取00到99之间的任意数字,我们用杠d(
\d
)杠d(\d
)代替;- 但是我们也知道IP地址的每一部分呢,也可以由两位数字构成,甚至是一位这样都是合法的,因此呢,我们可以直接将这里的第一个数字和第三个数字后面都加一个问号(
?
)。就可以表示这种情况了。数字的部分呢,我们就匹配完了。
- 但是我们也知道IP地址的每一部分呢,也可以由两位数字构成,甚至是一位这样都是合法的,因此呢,我们可以直接将这里的第一个数字和第三个数字后面都加一个问号(
接下来我们来匹配后面的句点之后呢,我们将全部表达式用括号(()
)括起来。这一段((25[0-5]|2[0-4]\d|[01]?\d\d?)\.
)呢,我们要求重复匹配三次,正则的表达式会匹配IP地址的前三段,并且包含每段后面的句点。至于最后面的一段数字,我们只需要将匹配第一段数字的这个部分((25[0-5]|2[0-4]\d|[01]?\d\d?)
)复制过来即可,最后呢,我们在首尾都加入杠b(\b
)来匹配字符的边界。可以看到,经过改良版的正则表达式,可以成功的匹配这里的三个IP地址,并且把不符合要求的这个排除在外了。但这个例子呢,也比较复杂。
最后呢,我列了个表,总结一下讲到的所有要点。但是在正则表达式中,其实还有许多没有讲到的高级概念。比如补货断言递归平衡组等等。
总结
- 限定符
a*
:a出现0次或多次a+
:a出现1次或多次a?
:a出现0次或1次a{6}
:a出现6次a{2,6}
:a出现2-6次a{2,}
:a出现两次以上
- 或运算符
(a|b)
:匹配a或者b(ab)|(cd)
:匹配ab或者cd
- 字符类
[abc]
:匹配a或者b或者c[a-c]
:同上[a-fA-F0-9]
:匹配小写+大写因为字符以及数字[^0-9]
:匹配非数字字符
- 元字符
\d
:匹配数字字符\D
:匹配非数字字符\w
:匹配单词字符(英文、数字、下划线)\W
:匹配非单词字符\s
:匹配空白符(包括换行符、Tab)\S
:匹配非空白符.
:匹配任意字符(换行符除外)\bword\b
:\b标注字符的边界^
:匹配行首$
:匹配行尾
- 贪婪/懒惰匹配
<.+>
:默认贪婪匹配“任意字符”<.+?>
:懒惰匹配“任意字符”
相关文章:
快速掌握正则表达式
文章目录 限定符 Qualifier第一个常用限定符 ?第二个常用限定符 *第三个常用限定符 或运算符字符类元字符 Meta-characters\d 数字字符\w 单词字符空白符 \s.任意字符^ $ 行首行尾 贪婪与懒惰匹配 Greedy vs Lazy Match实例 1 :RGB颜色匹配实例 2 &…...
git: ‘lfs‘ is not a git command unclear
首先可以尝试 git lfs install 是否可以,不可以后就看这个连接:https://stackoverflow.com/questions/48734119/git-lfs-is-not-a-git-command-unclear。 我的是ubuntu,所以: 保证这个前提: git-lfs requires git ve…...
代码随想录--哈希--两个数组的交集
题意:给定两个数组,编写一个函数来计算它们的交集。 说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。 import java.util.ArrayList; import java.util.HashMap; import java.util.List;public class SSS {public …...
基于腾讯文档进行应届生个人求职记录
1. 新建一个腾讯文档 电脑登录QQ,点击“腾讯文档”功能键。 2. 可以选择下载客户端,也可以直接进入网页版。(本人使用网页版) 3. 点击新建,选择在线表格。 4. 编辑表名,表内容。 5. 设置文档权限…...
计算机视觉实战项目(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别)
图像分类 教程博客_传送门链接:链接 在本教程中,您将学习如何使用迁移学习训练卷积神经网络以进行图像分类。您可以在 cs231n 上阅读有关迁移学习的更多信息。 本文主要目的是教会你如何自己搭建分类模型,耐心看完,相信会有很大收获。废话不…...
(18)线程的实例认识:线程的控制,暂停,继续,停止,线程相互控制,协作
话不多,但比较中肯,本文参照c# 线程暂停继续的实现方式_哔哩哔哩_bilibili 一、老方式 1、这是一个老的实现方式,基本不推荐,背后控制的原理需要了解。 界面:三个button一个textbox …...
c#动态保留小数位数的数值格式化方法实例----从小数点后非零数字保留两位进行四舍五入
c#动态保留小数位数的数值格式化方法实例----从小数点后非零数字保留两位进行四舍五入 功能介绍代码案例输出结果封装扩展方法控制台调用 其他方法地址 功能介绍 1. 输入的数字是整数,则直接返回整数部分的字符串表示。 2. 如果输入的数字是小数,则执行…...
大数据精准营销大数据平台应用场景有哪些,平台优势有哪些?
精准营销大数据平台应用场景有很多种,比如在银行领域,我通过相应的客户数据,也可以给客户推广一些银行业务。还可以运用于证券行业,除此之外还可以运用于保险或者信托行业,借助精准营销大数据平台可以进行主动营销。那…...
Pyspark案例综合(数据计算)
数据计算 map方法 map算子 map算子(成员方法)接受一个处理函数,可用lambda快速编写,对RDD内的元素一一处理,返回RDD对象 链式调用 对于返回值是新的RDD的算子,可以通过链式调用的方式多次调用算子 &q…...
电路电子技术1--关联参考方向及功率的计算
1.判断 电流由元件的低点位端流向高电位端的参考方向称为关联参考方向。() 考点:电流、电压的参考方向 解释:在一些复杂的电路中,往往不能预先确定某段电路上的电流、电压的实际方向,所以引进了 “关联参考方向”。为了能够解决问…...
【C++】AVL树的插入操作实现以及验证是否正确(带平衡因子)
文章目录 前言一、AVL树结点的定义二、AVL树的插入(Insert)插入完整代码:1.左单旋(RotateL)2.右单旋(RotateR)3.先右单旋再左单旋(RotateRL)1.保存的bf为02.保存的bf为13…...
【Linux-Day10-信号量,共享内存,消息队列】
信号量 信号量描述 信号量是一个特殊的变量,一般取正数值。它的值代表允许访问的资源数目,获取资源 时,需要对信号量的值进行原子减一,该操作被称为 P 操作。 当信号量值为 0 时,代表没有资源可用,P 操作…...
使用IntelliJ IDEA本地启动调试Flink流计算工程的2个异常解决
记录:471 场景:使用IntelliJ IDEA本地启动调试Flink流计算时,报错一:加载DataStream报错java.lang.ClassNotFoundException。报错二:No ExecutorFactory found to execute the application。 版本:JDK 1.…...
对象及日期对象
对象 1.什么是对象 类是对象的抽象,对象是类的实例 程序算法数据结构 万物皆对象,对象是一个具体的事物,看到见摸得着,对象是一组无序相关属性和方法的集合(无序,所以对象没有length属性),所有事物都是对象,列如字符串,数值,数组,函数等. 属性:事物的特征,在对象中用属性表…...
鼠标滚轮编码器解析
文章目录 前言一、鼠标滚轮编码器逻辑?二、使用步骤 1.引入库2.读入数据总结 前言 鼠标滚轮编码器为三脚接入,一个COM脚C(一般是接地),两个脉冲波形输入脚A、B,转动滚轮编码器会在两个脉冲输入脚上产生脉冲…...
【PTA】攀拓(PAT)- 程序设计(甲级)2023年春季考试
个人学习记录,代码难免不尽人意。 今天又斥资买了今年春季的真题一试,呃,感觉尽力了,89分,在当年排名23,感觉还不错,没有出现读不懂的题目和没有思路的情况,扣的11分分别是第二题两个…...
Spring Cloud Gateway 实现原理
Spring Cloud Gateway是Spring Cloud生态系统中的一个组件,用于构建基于Spring Boot的微服务架构中的网关服务。它的主要目的是提供一种灵活的方式来路由、过滤和转换HTTP请求,从而允许您构建强大、高性能的微服务应用程序。 以下是Spring Cloud Gatewa…...
嘉泰实业:真实低门槛,安全有保障
在互联网金融大行其道的当下,无论用户是多么的青睐、喜爱这种便捷的理财方式,也一定得把资金安全放在心上。要投就投那些实力背景雄厚,诚信经营的平台,可以选择投资用户基数庞大的理财老品牌,也可以选择发展势头迅猛的…...
spring boot 2.7 -> 3.0升级指南
spring boot提供一个版本迁移指南 2.7 -> 3.0...
MQTT 连接优化指南
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
算法和数据结构学习中的一些小的工具函数
算法和数据结构学习中的一些小的工具函数 作者:Grey 原文地址: 博客园:算法和数据结构学习中的一些小的工具函数 CSDN:算法和数据结构学习中的一些小的工具函数 提取一个数二进制最右侧的 1 比如二进制为:0100 0…...
解决2K/4K高分屏下Vmware等虚拟机下Kail Linux界面显示问题
问题现象 在我们日常使用VirtualBox、Vmware workstation、Hyper-V等虚拟机安装使用Kali系统,在2K/4K高分辨率电脑下Kali系统界面显示太小,包括各种软件及命令终端字体均无法很直观的看出,影响我们的正常测试及使用。 常规处理思路 很多人…...
【校招VIP】java语言考点之双亲委派模型
考点介绍: 双亲委派是校招面试中的高频考点之一。双亲委派机制定义: 当一个类加载器收到了类加载的请求的时候,他不会直接去加载指定的类,而是把这个请求委托给自己的父加载器去加载,只有父加载器无法加载这个类的时候࿰…...
2023年阿里云新用户云服务器价格表
阿里云,作为国内领先的云计算服务提供商,一直致力于为全球用户提供安全、稳定、高效的云计算服务。对于新用户来说,阿里云服务器是一个非常不错的选择。那么,阿里云新用户云服务器的价格是怎样的呢?本文将为大家详细介…...
信号相关名词概念汇总-采样周期、泄露、窗函数等
信号相关名词概念汇总-采样周期、泄露、窗函数等 以下为信号相关名词概念的汇总 1 名词解释 采样周期/间隔:采样频率的倒数,两次相邻采样之间的时间间隔采样时间:采样的总时长,即采样点数N和采样周期的乘积采样频率: …...
数字化新零售营销模式如何落地?数字化新零售营销功能推荐
通过科技手段,针对对线下零售店面的客户进行消费行为、频次等的分析,并进一步整合线上线下资源,实现实体零售的效率充分化,便是目前很火的新零售营销模式,能够将实体门店与数字化技术进行有机结合,通过为…...
712. 两个字符串的最小ASCII删除和 -- 动规
712. 两个字符串的最小ASCII删除和 class MinimumDeleteSum:"""712. 两个字符串的最小ASCII删除和https://leetcode.cn/problems/minimum-ascii-delete-sum-for-two-strings/"""def solution(self, s1: str, s2: str) -> int:""&qu…...
python中的小tips
1、注释 1、注释快捷键: Ctrl/ 可以注释掉光标所在的这一行,或者是选中的区域。 对于注释掉的这一行或者这一区域,按下ctrl/则会去掉注释。 2、多行注释 在写多行注释时,英文状态下写三个",会自动变成六个"&…...
高精度(加减乘除)
高精度算法出现的原因 当参与运算的数的范围大大的超出了标准数据类型,如int(-2147483648 ~ 2147483647)或者long long的范围,就需要使用高精度算法来进行数的运算。高精度运算的特点是代码长度比较长,本质是对数学运算…...
java企业数据管理系统
项目介绍 此项目为企业数据管理系统的后端部分,前端部分请参考vue-admin,项目实现了菜单管理、用户管理、角色管理和权限管理四个基础模块,前端菜单管理结合动态路由可自由添加菜单。结合Shiro权限管理实现了菜单和按钮的权限控制。 ❝ 前端…...
网站建设太金手指六六六/网络营销百度百科
//检测 window 中新增的对象 //first var oldMap {}; for(var i in window) {oldMap[i] 1; }//second for(var i in window) {if(oldMap[i]) continue;alert(i); }$()选择器获取到的既不是一个dom元素,也不是节点列表,而是一个新的对象$() 不传入任何参…...
制作游戏的网站/文件外链网站
相信很多人像我一样在学习python,pandas过程中对数据的选取和修改有很大的困惑(也许是深受Matlab)的影响。。。到今天终于完全搞清楚了!!!先手工生出一个数据框吧import numpy as npimport pandas as pddf pd.DataFrame(np.arang…...
兰州做网站公司哪家好/网站怎么推广出去
文章转载自:https://www.jianshu.com/p/c3c167e97bbd 常规的feign客户端接口定义 一般情况下,我们使用feign客户端调用其他服务时是这样定义的: FeignClient(name"xxx",fallbackxxx.class) public interface Hello(){ }这种方式…...
做抢单软件的网站/seo排名第一
1. 常用的FormData对象方法 获取表单对象中属性的值 formData.get(key);设置表单对象中属性的值 formData.set(key, value);删除表单对象中属性的值 formData.delete(key);向表单对象中追加属性值 formData.append(key, value); 注意: set()方法与append()方法的区…...
做个简单的网站多少钱/制作app平台需要多少钱
arm的开发环境有哪些1. ARM SDT: 是ARM公司为方便用户在ARM芯片上进行应用软件开发而推出的一整套开发工具。到ARM SDT 2.5.1,ARM宣布推出ARM ADS1.0取代了ARM SDT,不再对ARM SDT进行维护。ARM SDT支持的ARM处理器最高到包括ARM9在内的所有AR…...
网站开发与设计的社会环境/网推接单平台
文章目录概念操作性能分析实现框架插入查找删除构造和析构、赋值重载完整代码应用概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有结点的值都小于根结点的值若…...