当前位置: 首页 > news >正文

Python 正则表达式 (?=...) 和 (?<=...) 符号

Python 正则表达式

  • 引言
  • 正文
    • 示例1
    • 示例2
    • 示例3
    • 示例4

引言

今天遇到了一个比较棘手的问题,于是终于打算要对正则表达式中的 (?=...)(?<=...) 符号动手了。

正文

(?=...) 表示当 匹配时,匹配成功,但不消耗字符串中的任何字符。这个叫做 前视断言 (lookahead assertion)。比如, Isaac (?=Asimov) 将会匹配 Isaac ,仅当其后紧跟 Asimov

在 Python 正则表达式 (…) 符号 一文中,我们说明了为什么要使用 () 符号以及 ... 符号的含义。事实上,上述的 (?=...)(?<=...) 中的 ... 符号可以被替换为任意的符号,这里为了方便说明问题,我们将 ... 符号替换为 \t 符号。

示例1

import restr1 = 'abc\tdefghi\txyz'
print(re.search('(?=\t)', str1))
"""
result:
<re.Match object; span=(3, 3), match=''>
"""

可以看到,它匹配到了索引值为 3\t 字符,但是由于它是前视断言,即向前搜索,而我们的匹配项中 (?=\t) 之前并没有任何字符,因此什么也没有匹配到。

示例2

我们对示例 1 中的匹配内容稍作更改。

import restr1 = 'abc\tdefghi\txyz'
print(re.search('abc(?=\t)', str1))
"""
result:
<re.Match object; span=(0, 3), match='abc'>
"""

此时可以看到,匹配到了字符串 abc

示例3

(?<=...) 表示如果 ... 的匹配内容出现在当前位置的左侧,则匹配。这叫做 肯定型后视断言 (positive lookbehind assertion)(?<=abc)def 将会在 abcdef 中找到一个匹配,因为后视会回退 3 个字符并检查内部表达式是否匹配。内部表达式(匹配的内容)必须是固定长度的,意思就是 abca|b 是允许的,但是 a*a{3,4} 不可以。注意,以肯定型后视断言开头的正则表达式,匹配项一般不会位于搜索字符串的开头。

上面的解释比较抽象,那么具体是什么意思呢?我们看一个例子。

import restr1 = 'abc\tdefghi\txyz'
print(re.search('(?<=\t)def', str1))
"""
result:
<re.Match object; span=(4, 7), match='def'>
"""

程序先找到 def 字符串,然后再回退一个字符查看 def 前面的字符是否是 \t 字符,如果是,那么就匹配 def 字符串。

示例4

如果我们想要匹配两个 \t 字符中间的部分怎么办呢?

import restr1 = 'abc\tdefghi\txyz'
print(re.search('\t(.*)\t', str1))
"""
result:
<re.Match object; span=(3, 11), match='\tdefghi\t'>
"""

可以看到,此时,结果中包含了两端的 \t 字符,但是我们不想要它包含 \t 字符。为了实现这一目标,我们可以采用刚才我们提到的后视和前视。

import restr1 = 'abc\tdefghi\txyz'
print(re.search('(?<=\t).*(?=\t)', str1))
"""
result:
<re.Match object; span=(4, 10), match='defghi'>
"""

可以看到我们匹配到了两个 \t 字符中间的字符串,但是上述写法并不严谨,为了严谨,我们可以使用:

import restr1 = 'abc\tdefghi\txyz'
print(re.search('(?<=\t)(.*)(?=\t)', str1))
"""
result:
<re.Match object; span=(4, 10), match='defghi'>
"""

如果大家觉得有用,就请点个赞吧~

相关文章:

Python 正则表达式 (?=...) 和 (?<=...) 符号

Python 正则表达式 引言正文示例1示例2示例3示例4 引言 今天遇到了一个比较棘手的问题&#xff0c;于是终于打算要对正则表达式中的 (?...) 和 (?<...) 符号动手了。 正文 (?...) 表示当 … 匹配时&#xff0c;匹配成功&#xff0c;但不消耗字符串中的任何字符。这个…...

Vue.js中使用JavaScript实现路由跳转详解

在Vue应用中&#xff0c;利用Vue Router进行页面间的导航是一个常见需求。本篇博客将通过示例代码详细介绍如何在Vue组件中使用JavaScript实现路由跳转&#xff0c;包括传递参数的两种方式&#xff1a;通过params和query。让我们一步步深入了解。 基础设置 首先&#xff0c;确…...

社群裂变:从微光到星火的社群增长奥秘

在当今社交媒体盛行的时代&#xff0c;社群裂变已成为众多品牌、企业和个人实现快速增长的重要策略。社群裂变不仅能够有效扩大影响力&#xff0c;还能精准触达目标用户&#xff0c;实现高效转化。本文将深入探讨社群裂变的内涵、策略及实施方法&#xff0c;助您揭开社群增长的…...

Git命令Gitee注册idea操作git超详细

文章目录 概述相关概念下载和安装常见命令远程仓库介绍与码云注册创建介绍码云注册远程仓库操作关联拉取推送克隆 在idea中使用git集成add和commit差异化比较&查看提交记录版本回退及撤销与远程仓库关联 push从远程仓库上拉取&#xff0c;克隆项目到本地创建分支切换分支将…...

出差行程到底怎么管?这个“高分指南”划重点来了!

在日常商旅过程中&#xff0c;出差行程计划是必不可少的环节。公司需要以此为依据判断行程是否有必要、是否合理&#xff0c;确保出差行程与公司的业务需求相符。 通过胜意费控云&#xff0c;员工填写出差申请时&#xff0c;行程计划智能生成&#xff0c;平台自动匹配并带出差标…...

js设计模式--发布订阅者模式

概述 发布订阅者模式用于处理对象之间的事件通信&#xff0c;该模式涉及两个主要角色&#xff1a;发布者&#xff08;Publisher&#xff09;和订阅者&#xff08;Subscriber&#xff09; 发布者维护一个事件列表&#xff0c;并在事件发生时通知所有已注册的订阅者。订阅者可以…...

【图论】图论基础

图论不同地方讲的不太一样&#xff0c;本文仅限作者的理解 定义 图一般由点集 V V V 和边集 E E E 组成。 对于 v ∈ V v\in V v∈V&#xff0c;称 v v v 为该图的一个节点。 对于 e ∈ E e\in E e∈E&#xff0c;一般用二元组 ( u , v ) (u,v) (u,v) 表示 e e e&…...

Konga域名配置多个路由

云原生API网关-Kong部署与konga基本使用 Nginx server{listen 443 ssl;location / {proxy_pass http://127.0.0.1:8100;}location /openApi {proxy_pass http://172.31.233.35:7100/openApi;} } Kong {"id": "f880b21c-f7e0-43d7-a2a9-221fe86d9231&q…...

15.计算机网络

1.物理层的互联设备 中继器 和 集线器 2.集线器可以看做特殊的多路中继器 集线器 不可以做到自动寻址的功能 3.数据链路层 网桥 和 交换机 4.交换机是多端口网桥 5.网络层 路由器 6.应用层 网关 7.广播域 网络层 可以形成多个广播域 冲突域 网络层数据链路层 可以形成多个冲突域…...

【大数据·hadoop】在hdfs上运行shell基本常用命令

一、准备工作 1.1格式化并启动Hadoop服务 参见Hadoop在ubuntu虚拟机上的伪分布式部署|保姆级教程的4.7节 二、HDFS常用命令 接着&#xff0c;就愉快地在刚刚的命令行里敲命令啦 1.显示hdfs目录结构 hadoop fs -ls -R /hadoop fs: 这是Hadoop文件系统命令行的一部分&#x…...

TCP/IP 协议基础:构建互联网基石

目录 前言 一.网络通信协议 TCP/IP 1.网络通信协议 3.TCP/IP 协议 3.管理的组织和机构 4.RFC 二.OSI 参考模型 1.层次结构 2.通信机制 3.PDU 4.各层的功能 三.TCP/IP 协议簇 1.TCP/IP 与 OSI 的对应关系 2.TCP/IP 各层 3.TCP/IP 封装与分用 4.重要概念 5.分…...

Android OpenMAX(三)高通OMX组件实现基础

上一节了解了OMX组件实现的基础内容,这一节我们以高通OMX实现为例,简单看看如何实现一个OMX组件。本节代码参考自: omx_core_cmp.cpp qc_omx_component.h omx_vdec.h omx_vdec.cpp Tips:本篇文章旨在简单了解如何实现一个OMX组件,细节的内容不会仔细解读,代码阅读跳跃幅度…...

【比邻智选】MF871U模组

&#x1f680;搭载国产芯&#xff0c;严苛测试&#xff0c;稳定可靠 &#x1f6e0;️R16特性加持&#xff0c;5G LAN&#xff0c;纳秒级精度 &#x1f310;超低成本&#xff0c;丰富协议&#xff0c;连接无界限...

Unity 单例模式

Unity中单例模式是非常常用的写法&#xff0c;可以基于C#语言的几种不同方法来实现。 下面我将列出几种常见的实现方式&#xff1a; 1. 经典的单例模式 public class SingletonExample : MonoBehaviour {private static SingletonExample instance;public static SingletonEx…...

Oracle-一次TX行锁堵塞事件

问题背景&#xff1a; 接用户问题报障&#xff0c;应用服务出现大量会话堆积现象&#xff0c;数据库锁堵塞严重&#xff0c;需要协助进行问题定位和排除。 问题分析&#xff1a; 登录到数据库服务器上&#xff0c;首先查看一下数据库当前的等待事件情况&#xff0c;通过gv$ses…...

Gtid方式搭建主从复制+MHA高可用集群

GTID是什么 GTID(全局事务标识符),它用于唯一标识一个事务。每个GTID由三个部分组成: 服务器唯一标识符事务序列号全局事务标识符使用gtid可以简化主从复制的配置和管理,减少由于复制链路终端、主从数据不一致等问题带来的风险如何开启GTID: 在/etc/my.cnf文件中添加如下…...

基于matlab GUI的Alpha shapes边缘提取

1、程序介绍 本程序是基于matlab语言&#xff0c;使用alpha shapes算法实现点云边缘提取。算法具体原理参考博客&#xff1a;基于alpha shapes的边缘点提取&#xff08;matlab&#xff09;-CSDN博客。该程序包括3个按钮&#xff1a;加载点云、边缘点提取、保存。其中&#xff0…...

[Android]常见的包管理方式

在Android开发中&#xff0c;包管理主要是通过构建和依赖管理工具来处理。下面列举了几种最常见和主流的包管理方式&#xff1a; 一、Gradle Gradle 是 Android 官方推荐的构建工具&#xff0c;几乎成为了 Android 开发的标准。它支持自定义构建逻辑、依赖管理、多项目构建等…...

每日10亿数据的日志分析系统OOM

背景 一个每日10亿数据的日志清洗系统&#xff0c;主要工作就是从消息队列中消费各种各样的日志&#xff0c;然后对日志进行清洗&#xff0c;例如&#xff1a;用户敏感信息(姓名、手机号、身份证)进行脱敏处理,然后把清理完的数据交付给其他系统使用。 我们项目中&#xff0c;…...

智能驱动,精准管理:打造高效干部管理系统

干部管理系统是现代组织管理中不可或缺的工具&#xff0c;它通过信息技术的应用&#xff0c;提高了干部管理的效率和准确性。干部管理系统的主要功能包括&#xff1a; 1. 信息管理&#xff1a;系统可以存储和管理干部的个人信息&#xff0c;包括基本资料、工作经历、教育背景、…...

深度残差收缩网络(pytorch)框架+时序信号转格拉姆角场二维图; 将时序信号转换为二维图

深度残差收缩网络&#xff08;pytorch&#xff09;框架时序信号转格拉姆角场二维图&#xff1b; 将时序信号转换为二维图&#xff0c;使用深度残差收缩网络进行特征提取&#xff1b;训练后保存训练文件便于二次使用。 代码清晰&#xff0c;模型、训练、数据读取分类明显&#x…...

vue-beautiful-chat避坑指南:从安装配置到WebSocket实时通信的全流程解析

Vue2实时聊天组件深度实践&#xff1a;从vue-beautiful-chat配置到WebSocket全链路优化 当我们需要在Vue2项目中快速实现一个专业级聊天界面时&#xff0c;vue-beautiful-chat组件无疑是优雅的解决方案。但许多开发者在集成WebSocket实时通信功能时&#xff0c;常会遇到各种&q…...

DAMOYOLO-S效果展示:低光照、模糊、遮挡图像下的鲁棒检测能力

DAMOYOLO-S效果展示&#xff1a;低光照、模糊、遮挡图像下的鲁棒检测能力 1. 引言&#xff1a;当目标检测遇上“坏天气” 想象一下&#xff0c;你正在开发一个智能安防摄像头系统&#xff0c;或者一个自动驾驶的视觉模块。白天光线充足、画面清晰的时候&#xff0c;一切都很完…...

告别PCtoLCD2002!这款单片机调试助手如何用3步搞定OLED汉字显示?

3步解锁OLED汉字显示&#xff1a;新一代嵌入式开发神器实战指南 在嵌入式开发领域&#xff0c;OLED屏幕的汉字显示一直是让开发者头疼的难题。传统方案如PCtoLCD2002等取模软件不仅操作繁琐&#xff0c;生成的代码还需要大量手工调整。如今&#xff0c;一款名为单片机多功能调试…...

Deepin Boot Maker:智能解析引擎驱动的跨平台启动盘制作方案

Deepin Boot Maker&#xff1a;智能解析引擎驱动的跨平台启动盘制作方案 【免费下载链接】deepin-boot-maker 项目地址: https://gitcode.com/gh_mirrors/de/deepin-boot-maker Deepin Boot Maker是一款采用智能解析引擎的跨平台开源工具&#xff0c;通过自动化流程与硬…...

如何用SVGnest提升材料利用率:从问题到解决方案的完整指南

如何用SVGnest提升材料利用率&#xff1a;从问题到解决方案的完整指南 【免费下载链接】SVGnest An open source vector nesting tool 项目地址: https://gitcode.com/gh_mirrors/sv/SVGnest 制造业材料浪费的隐形成本&#xff1a;您的企业是否正在损失30%利润&#xff…...

告别Finalshell内存焦虑:实测Xshell 8与MobaXterm,哪款才是低资源占用的SSH神器?

深度评测&#xff1a;Xshell 8与MobaXterm如何解决SSH工具的资源占用难题&#xff1f; 当你的开发工作流被频繁的内存告警打断时&#xff0c;选择一款轻量高效的SSH工具就成为了提升生产力的关键。作为每天需要连接多台服务器的开发者&#xff0c;我深刻理解那种看着任务管理器…...

VMware虚拟机中SenseVoice-Small开发环境快速搭建

VMware虚拟机中SenseVoice-Small开发环境快速搭建 1. 引言 语音识别技术正在快速发展&#xff0c;而SenseVoice-Small作为一个高效的多语言语音识别模型&#xff0c;为开发者提供了强大的工具。但在实际开发中&#xff0c;我们经常需要一个隔离的环境来测试和部署模型&#x…...

OliveTin高级功能指南:定时任务、文件监控和实体动态更新

OliveTin高级功能指南&#xff1a;定时任务、文件监控和实体动态更新 【免费下载链接】OliveTin OliveTin gives safe and simple access to predefined shell commands from a web interface. 项目地址: https://gitcode.com/gh_mirrors/ol/OliveTin OliveTin是一个强…...

Flutter弹窗层级混乱?手把手教你用Overlay管理多个弹窗的显示顺序

Flutter弹窗层级管理实战&#xff1a;用Overlay解决多弹窗叠加难题 在移动应用开发中&#xff0c;弹窗是用户交互的重要组成部分。但当多个弹窗同时出现时&#xff0c;开发者常会遇到"哪个弹窗应该显示在最上层"的困扰。想象一下这样的场景&#xff1a;用户正在填写…...