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 指向路径或…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
