用断言更好地实现替换重复出现的单词

news2025/2/26 9:24:11

断言是指对匹配到的文本位置有要求。也就是说,在有些情况下,我们对要匹配的文本的位置也有一定的要求。为了解决这个问题,正则中提供了一些结构,只用于匹配位置,而不是文本内容本身,这种结构就是断言。常见的断言有三种:单词边界、行的开始或结束以及环视。

 1、单词边界(Word Boundary)

单词的组成一般可以用元字符 \w+ 来表示,\w 包括了大小写字母、下划线和数字(即 [A-Za-z0-9_])。那如果我们能找出单词的边界,也就是当出现了\w 表示的范围以外的字符,比如引号、空格、标点、换行等这些符号,我们就可以在正则中使用\b 来表示单词的边界。 \b 中的 b 可以理解为是边界(Boundary)这个单词的首字母。

 在准确匹配单词时,我们使用 \b\w+\b 就可以实现了。

2、行的开始或结束

和单词的边界类似,在正则中还有文本每行的开始和结束,如果我们要求匹配的内容要出现在一行文本开头或结尾,就可以使用 ^ 和 $ 来进行位置界定。

在计算机中,回车(\r)和换行(\n)其实是两个概念,并且在不同的平台上,换行的表示也是不一样的。我在这里列出了 Windows、Linux、macOS 平台上换行的表示方式。

 3、输入数据校验

在 Web 服务中,我们常常需要对输入的内容进行校验,比如要求输入 6 位数字,我们可以使用 \d{6} 来校验。但你需要注意到,如果用户输入的是 6 位以上的数字呢?在这种情况下,如果不去要求用户录入的 6 位数字必须是行的开头或结尾,就算验证通过了,结果也可能不对。比如下面的示例,在不加行开始和结束符号时,用户输入了 7 位数字,也是能校验通过的:

>>> import re
>>> re.search('\d{6}', "1234567") is not None
True    <-- 能匹配上 (包含6位数字)
>>> re.search('^\d{6}', "1234567") is not None
True    <-- 能匹配上 (以6位数字开头)
>>> re.search('\d{6}$', "1234567") is not None
True    <-- 能匹配上 (以6位数字结尾)
>>> re.search('^\d{6}$', "1234567") is not None
False   <-- 不能匹配上 (只能是6位数字)
>>> re.search('^\d{6}$', "123456") is not None
True    <-- 能匹配上 (只能是6位数字)

在多行模式下,^ 和 $ 符号可以匹配每一行的开头或结尾。大部分实现默认不是多行匹配模式,但也有例外,比如 Ruby 中默认是多行模式。

4、环视( Look Around)

环视就是要求匹配部分的前面或后面要满足(或不满足)某种规则,有些地方也称环视为零宽断言。这个小口诀你可以在心里默念几遍:左尖括号代表看左边,没有尖括号是看右边,感叹号是非的意思。

5、单词边界用环视表示

单词可以用 \w+ 来表示,单词的边界其实就是那些不能组成单词的字符,即左边和右边都不能是组成单词的字符。比如下面这句话:

the little cat is in the hatthe

左侧是行首,右侧是空格,hat 右侧是行尾,左侧是空格,其它单词左右都是空格。所有单词左右都不是 \w。

(?<!\w) 表示左边不能是单词组成字符,(?!\w) 右边不能是单词组成字符,即 \b\w+\b 也可以写成 (?<!\w)\w+(?!\w)。

另外,根据前面学到的知识,非\w 也可以用\W 来表示。那单词的正则可以写成 (?<=\W)\w+(?=\W)。

最后就是环视,它又分为四种情况:肯定逆向环视、否定逆向环视、肯定顺序环视、否定顺序环视。在使用的时候记住一个方法:有左尖括号代表看左边,没有尖括号是看右边,而感叹号是非的意思。

 此文章为8月Day22学习笔记,内容来源于极客时间《正则表达式入门课》,推荐该课程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/915878.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++_Linux报错问题记录

1、致命错误&#xff1a;vector&#xff1a;没有那个文件或目录 解决&#xff1a;.c文件只会引用C语言的标准库&#xff0c;vecter是属于C的语法&#xff0c;把文件名称改成cpp即可 2、.cpp文件中下面编译语句报错&#xff1a;对‘std::cout’未定义的引用 gcc -o test test.…

docker 报错

问题说明&#xff1a;我是服务器上面的docker拉到本地30卡想用的&#xff0c;但是失败&#xff0c;报错如下&#xff1a; 服务器上面显存驱动是450&#xff0c;本地30卡驱动是470 nvidia-docker run -it --name 20230821_3 --shm-size 16g -p 10029:22 --privileged 20230821_i…

关于cloudflare的“检查站点连接是否安全”一直反复转圈的问题

前一段时间访问不少网站都会出现类似以下的信息&#xff1a; 其中很多时候哦是没有红色框框一栏&#xff0c;就是拼命在转圈和刷新页面&#xff0c;等上一个小时都没用。以上情况看很多网上的说法是卸载浏览器安装的插件。我寻思我也没安装过什么插件。 对于试过网上不少方法但…

java八股文面试[java基础]—— hashCode 与 equals 区别 == 与 equals的区别

两个对象的hashCode()相同时&#xff0c;equals()相等吗&#xff1f;_两个对象的hashcode一样,equal一样么_不想当个程序员的博客-CSDN博客 equals()&#xff1a;比较的是非基本类型的数据的引用地址&#xff08;即内存地址&#xff09;是否相同&#xff0c;但是对于重写equal…

Vulnhub: DOUBLE: 1靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.209 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.209 目标80端口 sendcommand.php页面源码 写入webshell <?php system($_GET["cmd"]);?> 执行命令 ht…

不修改原图片,自动添加水印

只要添加我写的一个DynaWatermark2.1.1.jar的包,然后在web.xml里配置一下,哪个文件夹下的图片需要动态水印,就可以啦!以后通过页面访问这个文件夹下的图片,就会自动加上水印.但不会修改文件夹里图片本身.   这个jar里面有添加图片水印和文字水印两个servlet.(不能两个都配置,…

《golang设计模式》第二部分·结构型模式-03-组合模式(Composite)

文章目录 1. 概述1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述 将叶子节点和复合节点组合起来&#xff0c;定义一个抽象接口遍历他们 1.1 角色 Component&#xff08;抽象构件&#xff09;&#xff1a;为叶子构件和复合构件声明接口&#xff0c;定义了结构…

Docker安装并运行Alertmanager

Linux下安装Docker请参考&#xff1a;Linux安装Docker 简介 Alertmanager是一个独立的告警模块&#xff0c;接收Prometheus等客户端发来的警报&#xff0c;之后通过分组、删除重复等处理&#xff0c;并将它们通过路由发送给正确的接收器&#xff1b;告警方式可以按照不同的规…

openCV实战-系列教程2:阈值与平滑处理(图像阈值/图像平滑处理/高斯/中值滤波)、源码解读

1、图像阈值 t图像阈值函数&#xff0c;就是需要判断一下像素值大于一个数应该怎么处理&#xff0c;小于一个数应该怎么处理 ret, dst cv2.threshold(src, thresh, maxval, type) 参数解析&#xff1a; src&#xff1a; 原始输入图&#xff0c;只能输入单通道图像&#…

/root/.ssh/config line 2: Bad protocol 2 host key algorithms ‘+ssh-rsa‘.

文章目录 1、问题2、查看openssh版本3、解决问题4、重新生成密钥5、查看是否可连接工蜂 1、问题 ssh访问工蜂报错&#xff1a; [rootlocalhost .ssh]# ssh -T gitgit.code.tencent.com /root/.ssh/config line 2: Bad protocol 2 host key algorithms ‘ssh-rsa’. 2、查看o…

如何识别芯片引脚1

当从上面看芯片时&#xff0c;引脚总是按逆时针方向编号。这来自于旧时代的电子管&#xff0c;当从电子管的底部看时&#xff0c;引脚是按顺时针方向编号的。 芯片的标记方式有多种&#xff0c;但是总有一些惯例可循。换句话说&#xff0c;如果你在一个未知的芯片上发现了这些标…

Linux的基础编程——Linux常用操作总结(十一)

前言&#xff1a; 前面我们已经对在Linux系统上的一些常用操作已经有了一个简单的入门与了解&#xff0c;后面的学习中我们还需要对这些操作常加练习&#xff0c;现在让我们对之前的一些常用操作进行的一个简单的总结吧 目录 一、软件安装 CentOS系统使用&#xff1a; Ubun…

pdf转换成excel怎么转换?看看这几种方法

pdf转换成excel怎么转换&#xff1f;转换PDF文件到Excel是一个常见的需求&#xff0c;因为许多工作需要将PDF文件转换成可编辑和可搜索的Excel电子表格。无论是在学校、办公室还是在家里&#xff0c;将PDF文件转换成Excel文件的需求都屡见不鲜。有时候&#xff0c;你可能需要将…

江苏211+双一流学校,专业课比408难度低,来看看23考情吧

南京师范大学 考研难度&#xff08;☆☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文预计813字&#xff0c;预计阅读&#xff1a;2分钟。 2023考情概况 南…

(五)Docker 安装 redis镜像+启动redis容器(超详细)

输入&#xff1a;su root命令&#xff0c;切换到root 1、启动Docker 启动&#xff1a;sudo systemctl start docker 停止&#xff1a;systemctl stop docker 重启&#xff1a;systemctl restart docker 查看docker运行状态&#xff08;显示绿色代表正常启动&#xff09;&#x…

配置真实项目问题1--拉取项目并搭建环境

一、下载nvm安装管理node版本 1.安装nvm之前一定要把电脑中原有的node版本给卸载干净&#xff1b; 2.nvm下载链接&#xff1a;nvm.uihtm.com/ 3.具体安装流程可以参考https://zhuanlan.zhihu.com/p/550264306这篇文档 4.安装之后&#xff0c;在控制台中查看版本node -v,发现依旧…

长胜证券:新三板转板条件?

跟着时间的推移和环境的变化&#xff0c;商场对解决中小企业融资难的需求日益增加&#xff0c;新三板作为商场化的多层次资本商场&#xff0c;为小微企业融资供给了重要途径。但是&#xff0c;跟着新三板商场的逐步老练&#xff0c;越来越多的企业希望通过转板进入更为活泼的A股…

Java版工程行业管理系统源码-专业的工程管理软件-提供一站式服务 em

​ 鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工…

张少光:快递件量显韧性 价格仍承压

张少光指出&#xff0c;今年以来居民消费需求偏弱&#xff0c;快递件量增速表现稳健耐性&#xff0c;但价格在职业竞赛下出现下滑走势。咱们以为当时职业进入存量博弈期&#xff0c;价格下行压力或继续&#xff0c;件量增速出现放缓趋势&#xff0c;咱们主张优选具备α的龙头快…

如何深入理解 JavaScript 中的懒加载

懒加载是一种延迟加载非必要内容的方法&#xff0c;直到用户需要查看它为止。与其他加载方法不同&#xff0c;其他加载方法在访问页面时同时加载所有网站资源&#xff0c;而懒加载采取更加谨慎的方式。它延迟显示某些元素&#xff0c;如图片、视频和其他多媒体&#xff0c;直到…