首页 > 其他分享 >用断言更好地实现替换重复出现的单词

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

时间:2023-09-07 23:02:59浏览次数:41  
标签:None 匹配 断言 环视 search 单词 re 替换


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

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

 1、单词边界(Word Boundary)

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

用断言更好地实现替换重复出现的单词_感叹号_02

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

2、行的开始或结束

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

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

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

 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)。

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


标签:None,匹配,断言,环视,search,单词,re,替换
From: https://blog.51cto.com/key3feng/7402490

相关文章

  • 如何在jupyter notebook中批量替换文本
    在JupyterNotebook中,您可以使用以下步骤来批量替换文本:1.打开JupyterNotebook并导航到包含需要替换文本的笔记本。2.在需要替换的代码或文本的单元格中,使用快捷键`Ctrl+F`(Windows和Linux)或`Command+F`(Mac)打开查找工具。3.在查找工具中输入您要替换的文本,并点击查找下......
  • 为什么有些英语单词比如borrow中的r要双写,有什么历史起源吗
    英语中有些单词的拼写规则并不总是符合我们对字母发音的直觉。在单词"borrow"中,为什么字母"r"要双写,这涉及到英语的历史演变和拼写规则。在英语的发展过程中,拼写规则经历了多次调整和变化。在中古英语时期,英语中的辅音字母通常会双写,以表示其前面的元音字母为短元音。这种双......
  • 为什么英语单词比如lady的复数是ladies
    英语中的很多单词在构成复数形式时,会通过改变单词的拼写来表示复数。对于"lady"这个单词来说,它的复数形式是"ladies"。关于为什么"lady"变成"ladies",这涉及到英语的历史和语言演变。在古代英语中,名词的复数形式通常会通过在词尾添加"-as"或"-es"来表示。随着时间的推移......
  • 【python技巧】替换文件中的某几行
    【python技巧】替换文件中的某几行1.背景描述最近在写一个后端项目,主要的操作就是根据用户的前端数据,在后端打开项目中的代码文件,修改对应位置的参数,因为在目前的后端项目中经常使用这个操作,所以简单总结一下。1.文件路径:./test.c2.文件内容……caseEPA:chan_des......
  • 【python技巧】替换文件中的某几行
    (【python技巧】替换文件中的某几行)1.背景描述最近在写一个后端项目,主要的操作就是根据用户的前端数据,在后端打开项目中的代码文件,修改对应位置的参数,因为在目前的后端项目中经常使用这个操作,所以简单总结一下。1.文件路径:./test.c2.文件内容……caseEPA:chan_de......
  • 格式化消息,参数化替换 {} 占位符
    MessageUtils.javaimportjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;/***消息工具类*/publicclassMessageUtils{publicstaticvoidmain(String[]args){System.out.println(formatMessage("{}是{}年{}月{}日星......
  • 一次尝试:一种基于Common Lisp的简易单词本命令行工具
    绪论背景英语的学习给现代中国学生带来了极大的挑战。学习英语的一种常规做法是记录纸质笔记。然而,常规的纸质笔记具有书写慢、不易修改的特点……(编不下去了)。为了简化英语单词笔记记录、查看的操作,本文基于一种简单的数据管理方法,提出一种新型单词本,即lisp-dictionary命令行工......
  • 【计算机毕业设计】英语单词小程序源码
    开发环境及工具:大等于jdk1.8,大于mysql5.5,idea(eclipse),微信开发者工具技术说明:springbootmybatishtmlvue.jsbootstrap小程序代码注释齐全,没有多余代码,适合学习(毕设),二次开发,包含论文技术相关文档。功能介绍:用户端:登录注册(含授权登录)首页显示搜索,单词列表,搜索可根据单词名称模糊......
  • 直线导轨的替换方法
    目前,直线导轨的使用率持续上升,已广泛应用在各种各样的行业中,可替换性高是其广泛使用的重要原因之一!直线导轨的替换指的就是导轨和滑块可以单出,不用整套替换。市面上使用率最高的直线导轨品牌应该就是台湾*银了,其质量佳,但货期较久,简单点来说,就是要等货,对于刚需的厂商来说,是非常不方......
  • Python开发实例(十一)单词记忆游戏:编写一个简单的游戏,测试用户对一组随机单词的记忆能力
    在这个实例中,我们将创建一个简单的单词记忆游戏。游戏的规则是随机展示一组单词,然后要求用户在一定时间内尽可能多地记住这些单词。时间到后,再询问用户输入这些单词。最后,计算并显示用户正确记住的单词数量。下面是单词记忆游戏的Python程序:pythonCopycodeimportrandomimport......