RegExp正则表达式左限定右限定左右限定,预查询,预查寻,断言 : (?<= , (?= , (?<! , (?!
RegExp正则表达式左限定右限定左右限定,预查询,预查寻,断言 : (?<= , (?= , (?<! , (?! 有好多种称呼
(?<=
, (?=
, (?<!
, (?!
有好多种称呼 ,
我称为: 左限定, 右限定, 左否定, 右否定
(?<=左限定)
(?=右限定)
(?<!左否定)
(?!右限定)
再提炼
?<=
?=
?<!
?!
其它的称呼
正则表达式预查寻分为 4 种:
- 正向肯定预查:
(?=pattern)
(?=pattern) - 正向否定预查:
(?!pattern)
(?!pattern) - 反向肯定预查:
(?<=pattern)
(?<=pattern) - 反向否定预查:
(?<!pattern)
(?<!pattern)
比如:
- 匹配
babcab
中的第二个b
, 可以用(?<=a)b(?=c)
, 含义是:左a右c的b (?<!a)b(?!c)
的含义是: 左非a右非c的b, 它会匹配到第一个b
或者称为:
- 正向零宽度先行断言:
(?=exp)
(?=exp) - 正向零宽度回顾后断言:
(?!exp)
(?!exp) - 负向零宽度先行断言:
(?<=exp)
(?<=exp) - 负向零宽度回顾后断言:
(?<!exp)
(?<!exp)
或者称为:
- 肯定性:匹配
regex
- 否定性:不匹配
regex
- 前瞻:向前(右、正向)看(预查)
- 后顾:向后(左、反向)看(预查)
- 肯定性前瞻:先看看前方(右边)是否匹配
regex
,但不向前走 - 否定性前瞻:先看看前方(右边)是否不匹配
regex
,但不向前走 - 肯定性后顾:回头看后方(左边)是否匹配
regex
- 否定性后顾:回头看后方(左边)是否不匹配
regex
或者称为:
菜鸟教程-正则表达式的先行断言(lookahead)和后行断言(lookbehind)
-
(?=pattern)
零宽正向先行断言(zero-width positive lookahead assertion) -
(?!pattern)
零宽负向先行断言(zero-width negative lookahead assertion) -
(?<=pattern)
零宽正向后行断言(zero-width positive lookbehind assertion) -
(?<!pattern)
零宽负向后行断言(zero-width negative lookbehind assertion)
菜鸟教程-正则表达式 - 元字符
`
字符 | 描述 |
---|---|
(?=pattern) | 正向肯定预查(look ahead positive assert),在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。 |
(?!pattern) | 正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。 |
(?<=pattern) | 反向(look behind)肯定预查,与正向肯定预查类似,只是方向相反。 例如," (?<=95|98|NT|2000)Windows "能匹配"2000Windows "中的"Windows ",但不能匹配"3.1Windows "中的"Windows "。 |
(?<!pattern) | 反向否定预查,与正向否定预查类似,只是方向相反。 例如" (?<!95|98|NT|2000)Windows "能匹配"3.1Windows "中的"Windows ",但不能匹配"2000Windows "中的"Windows "。 |
来自 文心一言 4.0
在正则表达式中,如果你想限定一个模式(pattern)的左右相邻内容,你可以使用断言(assertions)。常见的断言有:
-
正向前瞻断言(Positive Lookahead) -
(?=pattern)
- 表示之后的字符序列需要匹配给定的模式,但该模式本身不会成为匹配结果的一部分。
-
负向前瞻断言(Negative Lookahead) -
(?!pattern)
- 表示之后的字符序列不能匹配给定的模式。
-
正向后顾断言(Positive Lookbehind) -
(?<=pattern)
- 表示之前的字符序列需要匹配给定的模式,但该模式本身不会成为匹配结果的一部分。
-
负向后顾断言(Negative Lookbehind) -
(?<!pattern)
- 表示之前的字符序列不能匹配给定的模式。
请注意,不是所有的正则表达式引擎都支持后顾断言,尤其是负向后顾断言。
下面是一些例子:
-
匹配被"abc"和"def"包围的字符串:
(?<=abc).*?(?=def)
在这个例子中,
.*?
是一个懒惰量词,它会匹配尽可能少的字符直到遇到def
。 -
匹配不被数字包围的单词:
\b(?<![0-9])[a-zA-Z]+\b(?![0-9])
这里使用了单词边界
\b
,负向后顾断言(?<![0-9])
和负向前瞻断言(?![0-9])
来确保单词的前后都不是数字。 -
匹配被引号包围的文本(不包含引号本身):
(?<=")[^"]*(?=")
这个表达式使用了正向后顾断言
(?<=")
和正向前瞻断言(?=")
来匹配引号之间的文本。[^"]*
匹配除引号外的任意字符(0个或多个)。
请记住,正则表达式中特殊字符和元字符通常需要转义(例如,在字符串中使用 \\
代替 \
,使用 \"
代替 "
)。这取决于你使用的编程语言和上下文。
最后,由于正则表达式的复杂性和多样性,建议在实际应用中仔细测试你的表达式以确保它按照预期工作。
来自 文心一言 3.5
正则表达式预查寻(也称为预查或断言)是一种特殊的匹配技术,用于在匹配位置之前或之后执行条件判断,而不会真正消耗字符串中的字符。预查寻可以用来限定左右相邻的内容,确保它们符合特定的模式。
预查寻包括正向预查和反向预查,每种预查又可以分为肯定预查和否定预查。
-
正向预查:
- 正向肯定预查:语法为
(?=pattern)
。它会匹配任何位置,该位置后面紧跟着符合指定模式的字符串。但是,该模式本身不会被包括在匹配结果中。例如,表达式Windows(?=95|98|NT)
会匹配任何以“Windows”开始,后面紧跟着“95”、“98”或“NT”的字符串。但匹配结果只包括“Windows”,不包括后面的操作系统版本。 - 正向否定预查:语法为
(?!pattern)
。它会匹配任何位置,该位置后面不能紧跟着符合指定模式的字符串。例如,表达式\d+(?!\.)
会匹配任何不以小数点结尾的数字序列。
- 正向肯定预查:语法为
-
反向预查:
- 反向肯定预查:语法为
(?<=pattern)
。它会匹配任何位置,该位置前面紧挨着符合指定模式的字符串。但是,该模式本身不会被包括在匹配结果中。例如,表达式(?<=19|20)\d{2}
会匹配任何以“19”或“20”开始的两位数字,但匹配结果不包括前面的“19”或“20”。 - 反向否定预查:语法为
(?<!pattern)
。它会匹配任何位置,该位置前面不能紧挨着符合指定模式的字符串。请注意,这种形式的反向否定预查在大多数正则表达式引擎中不受支持。
- 反向肯定预查:语法为
预查寻在正则表达式中非常有用,特别是在处理复杂的模式匹配和验证时。通过使用预查寻,你可以更精确地控制匹配的位置,确保左右相邻的内容符合特定的要求。
问 C知道 “如何用正则表达式限定左右相邻内容”
使用正则表达式可以通过限定左右相邻内容来配特定的模式。以下是一种常用的方法:
import re# 使用正则表达式限定左右相邻内容
pattern = r'(?<=左边的内容)要匹配的内容(?=右边的内容)'# 在文本中搜索匹配的内容
text = "左边的内容要匹配的内容右边的内容"
matches = re.findall(pattern, text)# 输出匹配的结果
for match in matches:print(match)
在上述代码中,我们使用了正则表达式的两个特殊符号来限定左右相邻内容:
(?<=左边的内容)
:表示要匹配的内容的左边必须是指定的左边内容。(?=右边的内容)
:表示要匹配的内容的右边必须是指定的右边内容。
你可以根据实际情况修改左边的内容
、要匹配的内容
和右边的内容
来适应你的需求。
问 C知道 “正则表达式预查寻”
正则表达式预查是一种特殊的正则表达式语法,用于在匹配过程中进行前瞻或后顾判断,而不会消耗字符。预查可以帮助我们在匹配时确定某些条件是否满足,从而更精确地匹配目标字符串。
正则表达式预查分为正向预查和反向预查两种类型。正向预查用于匹配在某个位置之后的内容,而反向预查则用于匹配在某个位置之前的内容。
下面是两个示例来演示正则表达式预查的使用:
- 正向预查示例:匹配后面跟着数字的单词
import retext = "apple123 orange456 banana789"
pattern = r"\w+(?=\d)" # 匹配后面跟着数字的单词
result = re.findall(pattern, text)
print(result) # 输出:['apple', 'orange', 'banana']
- 反向预查示例:匹配前面跟着数字的单词
import retext = "123apple 456orange 789banana"
pattern = r"(?<=\d)\w+" # 匹配前面跟着数字的单词
result = re.findall(pattern, text)
print(result) # 输出:['apple', 'orange', 'banana']
问 C知道 “正则表达式断言”
正则表达式断言是一种用于匹配字符串中特定位置的模式。它们不会消耗输入字符串,只是检查当前位置是否满足某些条件。正则表达式断言分为前行断言和后行断言。
-
前行断言(Positive Lookahead Assertion):用于匹配当前位置后面的内容是否满足某个条件。它使用语法
(?=pattern)
,其中pattern
是一个正则表达式。例如,要匹配字符串中包含"re"的单词,但不包括"regex"和"regular",可以使用前行断言re(?=gex|gular)
。 -
后行断言(Positive Lookbehind Assertion):用于匹配当前位置前面的内容是否满足某个条件。它使用语法
(?<=pattern)
,其中pattern
是一个定长的正则表达式。后行断言在Perl和Python中有一些限制,它们只能使用定长的表达式,不能使用*
、+
、?
等元字符。例如,要匹配除"regex"和"regular"之外的"re",可以使用后行断言(?<!g)re
。
需要注意的是,不同的编程语言对正则表达式断言的支持程度有所不同。Perl和Python对后行断言有一些限制,Java不支持*
和+
字符,而JavaScript则不支持后行断言。
可能不正确, 经验证, JavaScript是支持(?<=a)b(?=c)
这样的的
其它待验证
相关文章:

RegExp正则表达式左限定右限定左右限定,预查询,预查寻,断言 : (?<= , (?= , (?<! , (?!
RegExp正则表达式左限定右限定左右限定,预查询,预查寻,断言 : (?< , (? , (?<! , (?! 有好多种称呼 (?< , (? , (?<! , (?! 有好多种称呼 , 我称为: 左限定, 右限定, 左否定, 右否定 (?<左限定) (?右限定)(?<!左否定) (?!右限定) 再…...

相机图像质量研究(30)常见问题总结:图像处理对成像的影响--重影
系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…...

问题记录——c++ sort 函数 和 严格弱序比较
引出 看下面这段cmp函数的定义 //按照vector第一个元素升序排序 static bool cmp(const vector<int>& a, const vector<int>& b){return a[0] < b[0]; }int eraseOverlapIntervals(vector<vector<int>>& intervals) {//按区间左端排序…...

《Go 简易速速上手小册》第9章:数据库交互(2024 最新版)
文章目录 9.1 连接数据库 - Go 语言的海底宝藏之门9.1.1 基础知识讲解安装数据库驱动数据库连接 9.1.2 重点案例:用户信息管理系统准备数据库Go 代码实现连接数据库添加新用户查询用户信息用户登录验证主函数 9.1.3 拓展案例 1:批量添加用户准备数据库Go…...
redis的hash数据结构底层简记
hash:k和v都是string的hash表。 HSET(设置集合数据,4.0之前只能设置1个,之后可以设置多个),HSETNX(若k不存在则设置对应v),HDEL(删除指定kv,可以一次删除多个)…...

清除Django的管理员admin站点中“Recent Actions“最近活动面板上的所有信息
清除Django的管理员admin站点中"Recent Actions"最近活动面板上的所有信息 本文主要介绍了如何清除Django的管理员admin站点中"Recent Actions"最近活动面板上的所有信息 操作步骤如下 进入Django项目目录中运行代python manage.py shell进入Django shell…...

【JVM篇】ThreadLocal中为什么要使用弱引用
文章目录 🍔ThreadLocal中为什么要使用弱引用⭐总结 🍔ThreadLocal中为什么要使用弱引用 ThreadLocal可以在线程中存放线程的本地变量,保证数据的线程安全 ThreadLocal是这样子保存对象的: 在每个线程中,存放了一个…...

Stable Diffusion教程——stable diffusion基础原理详解与安装秋叶整合包进行出图测试
前言 在2022年,人工智能创作内容(AIGC)成为了AI领域的热门话题之一。在ChatGPT问世之前,AI绘画以其独特的创意和便捷的创作工具迅速走红,引起了广泛关注。随着一系列以Stable Diffusion、Midjourney、NovelAI等为代表…...

【JavaEE】_线程与多线程的创建
目录 1. 线程的概念 2. 创建与使用多线程 2.1 方式1:继承Thread类 2.2 方式2: 实现Runnable接口 2.3 以上两种创建线程方式的对比 3. 多线程的优势-增加运行速度 1. 线程的概念 进程的存在是由于系统的多任务执行需求,这也要求程序员进…...

【前端工程化面试题】如何优化提高 webpack 的构建速度
使用最新版本的 Webpack 和相关插件: 每个新版本的 Webpack 都会带来性能方面的改进和优化,因此始终确保你在使用最新版本。同时,更新你的相关插件也是同样重要的。 使用DllPlugin动态链接库: 使用DllPlugin和DllReferencePlugin来将第三方库的代码进行…...

免费chatgpt使用
基本功能如下: https://go.aigcplus.cc/auth/register?inviteCode3HCULH2UD...

OpenCV识别人脸案例实战
使用级联函数 基本流程 函数介绍 在OpenCV中,人脸检测使用的是cv2.CascadeClassifier.detectMultiScale()函数,它可以检测出图片中所有的人脸。该函数由分类器对象调用,其语法格式为: objects cv2.CascadeClassifier.detectMul…...
VOSK——离线语音库
文章目录 识别函数调用添加自定义热词表1. SetWords2. SetLatticeWords3. SetPartialWords使用示例注意1. SetMaxAlternatives2. SetNLSML3. SetSpkModel4. SetGrammar使用示例注意SetLogLevel示例用法注意事项 识别函数调用 在使用Vosk库进行语音识别时,PartialRe…...

ELAdmin 隐藏添加编辑按钮
使用场景 做了一个监控模块,数据都是定时生成的,所以不需要手动添加和编辑功能。 顶部不显示 可以使用 true 或者 false 控制现实隐藏 created() {this.crud.optShow {add: false,edit: false,del: true,download: true,reset: true}},如果没有 crea…...
浅谈Websocket
由于 http 存在⼀个明显的弊端(消息只能有客户端推送到服务器端,⽽服务器端不能主动推送到客户端),导致如果服务器如果有连续的变化,这时只能使⽤轮询,⽽轮询效率过低,并不适合。于是 WebSocket 被发明出来 WebSocket 是⼀种在 Web 应⽤程序中实现双向通信的协议。与传…...
JavaScript闭包详细介绍
文章目录 什么是闭包优点:变量持久化:封装私有变量:模块化:函数工厂: 缺点:内存占用:调试困难:过度使用导致性能下降: 什么是闭包 闭包是指有权访问另一个函数作用域中的…...
pytorch神经网络入门代码
import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms# 定义神经网络结构 class SimpleNN(nn.Module):def __init__(self, input_size, hidden_size, num_classes):super(SimpleNN, self).__init_…...

代码随想录算法训练营第三十四天|860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
860.柠檬水找零 链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 细节: 1. 首先根据题意就是只有5.的成本,然后就开始找钱,找钱也是10.和5. 2. 直接根据10 和 5 进行变量定义,然后去循环…...

Ditto:提升剪贴板体验的宝藏软件(复制粘贴效率翻倍、文本处理好助手)
名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、什么是Ditto?二、下载安装三、如…...
【自然语言处理-工具篇】spaCy<2>--模型的使用
前言 之前已经介绍了spaCy的安装,接下来我们要通过下载和加载模型去开始使用spaCy。 下载模型 经过训练的 spaCy 管道可以作为 Python 包安装。这意味着它们是应用程序的一个组件,就像任何其他模块一样。可以使用 spaCy download的命令安装模型,也可以通过将 pip 指向路径或…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...