正则表达式语法详解(python)

目录

引言

第一部分:正则表达式基础

1. 什么是正则表达式?

2. 正则表达式的组成

3. 正则表达式的执行过程

第二部分:常用正则表达式元字符

1. 点号(.)

2. 星号(*)

3. 加号(+)

4. 问号(?)

5. 花括号({})

6. 方括号([])

7. 脱字符(^)

8. 美元符号($)

第三部分:高级正则表达式技巧

1. 捕获组

2. 反向引用

3. 非捕获组

4. 前瞻断言与后瞻断言

5. 贪婪与非贪婪模式

第四部分:正则表达式实战案例

1. 电子邮件地址验证

2. 电话号码提取

3. HTML标签清理

第五部分:常见错误与陷阱

1. 忘记转义特殊字符

2. 误用量词导致的性能问题

3. 忽略字符编码问题


引言

正则表达式(Regular Expression,简称 regex 或 regexp)是一种强大的文本处理工具,广泛应用于各种编程语言和工具中。无论是用于搜索、替换、验证还是提取特定模式的数据,正则表达式都能提供高效且灵活的解决方案。本文将详细介绍正则表达式的基本概念、常用元字符、高级技巧以及实战案例,帮助读者从入门到精通。

第一部分:正则表达式基础

1. 什么是正则表达式?

正则表达式是一种描述字符串模式的语言。它允许你定义一个模式,然后用这个模式来匹配、查找、替换或验证字符串。正则表达式通常用于文本处理任务,如搜索和替换文本中的特定模式。

2. 正则表达式的组成
  • 字符集:普通字符(如字母、数字)和特殊字符(如元字符)。
  • 元字符:具有特殊含义的字符,如 .*+ 等。
  • 量词:指定字符或字符集出现的次数,如 *+?{}
  • 断言:指定匹配条件,如 ^$\b
3. 正则表达式的执行过程

正则表达式引擎会从左到右扫描输入字符串,并尝试匹配定义的模式。如果找到匹配项,引擎会返回匹配的结果;否则,返回不匹配的结果。正则表达式引擎支持多种匹配模式,如贪婪匹配和非贪婪匹配。

第二部分:常用正则表达式元字符

1. 点号(.)
  • 含义:匹配除换行符外的任意单个字符。
  • 示例a.b 可以匹配 a1ba ba$b 等。
2. 星号(*)
  • 含义:匹配前一个字符零次或多次。
  • 示例ab*c 可以匹配 acabcabbc 等。
3. 加号(+)
  • 含义:匹配前一个字符一次或多次。
  • 示例ab+c 可以匹配 abcabbcabbbc 等。
4. 问号(?)
  • 含义:匹配前一个字符零次或一次。
  • 示例ab?c 可以匹配 acabc
5. 花括号({})
  • 含义:指定某个模式出现的具体次数。
  • 示例a{2,4} 可以匹配 aaaaaaaaa
6. 方括号([])
  • 含义:匹配方括号内的任一字符。
  • 示例[abc] 可以匹配 abc
7. 脱字符(^)
  • 含义:在方括号内表示非该范围内的字符;在字符串开头表示非此模式。
  • 示例[^abc] 可以匹配除 abc 以外的任何字符;^abc 表示以 abc 开头的字符串。
8. 美元符号($)
  • 含义:表示字符串的结尾。
  • 示例abc$ 表示以 abc 结尾的字符串。

第三部分:高级正则表达式技巧

1. 捕获组
  • 含义:使用圆括号 () 创建捕获组,可以提取匹配的部分。
  • 示例(ab)c 可以匹配 abc,并且捕获组会捕获 ab
2. 反向引用
  • 含义:利用捕获组实现复杂匹配,使用 \1\2 等反向引用。
  • 示例(\w+)\1 可以匹配连续两次出现的单词,如 testtest
3. 非捕获组
  • 含义:使用 (?:...) 创建非捕获组,不会被捕获。
  • 示例(?:ab)c 可以匹配 abc,但不会捕获 ab
4. 前瞻断言与后瞻断言
  • 正向前瞻断言(?=...),匹配后面跟指定模式的字符串。
  • 负向前瞻断言(?!...),匹配后面不跟指定模式的字符串。
  • 正向后瞻断言(?<=...),匹配前面有指定模式的字符串。
  • 负向后瞻断言(?<!...),匹配前面没有指定模式的字符串。
  • 示例abc(?=def) 可以匹配 abc,但前提是后面必须跟着 def
5. 贪婪与非贪婪模式
  • 贪婪模式:量词默认是贪婪的,尽可能多地匹配字符。
  • 非贪婪模式:在量词后加上 ?,尽可能少地匹配字符。
  • 示例a.*b 贪婪模式匹配 a...ba.*?b 非贪婪模式匹配 a...b 中的第一个 b

第四部分:正则表达式实战案例

1. 电子邮件地址验证
  • 需求:验证一个字符串是否符合电子邮件地址的格式。
  • 正则表达式^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
  • 示例
    import reemail_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
    test_emails = ["example@example.com", "invalid-email", "user@domain.co.uk"]for email in test_emails:if re.match(email_pattern, email):print(f"{email} 是有效的电子邮件地址")else:print(f"{email} 是无效的电子邮件地址")
2. 电话号码提取
  • 需求:从文本中提取电话号码。
  • 正则表达式\d{3}-\d{3}-\d{4}
  • 示例
    import rephone_pattern = r'\d{3}-\d{3}-\d{4}'
    text = "请拨打 123-456-7890 或者 987-654-3210 联系我们。"phone_numbers = re.findall(phone_pattern, text)
    print("提取的电话号码:", phone_numbers)
3. HTML标签清理
  • 需求:从字符串中去除HTML标签。
  • 正则表达式<[^>]+>
  • 示例
    import rehtml_pattern = r'<[^>]+>'
    text = "<p>这是一个段落。</p><div>这是另一个段落。</div>"cleaned_text = re.sub(html_pattern, '', text)
    print("清理后的文本:", cleaned_text)

第五部分:常见错误与陷阱

1. 忘记转义特殊字符
  • 问题:特殊字符如 .*+?()[]{}|\ 需要转义。
  • 解决方法:使用反斜杠 \ 转义特殊字符。
2. 误用量词导致的性能问题
  • 问题:贪婪量词可能导致正则表达式引擎进行大量不必要的回溯。
  • 解决方法:使用非贪婪量词或优化正则表达式。
3. 忽略字符编码问题
  • 问题:处理非ASCII字符时,忽略字符编码可能导致匹配失败。
  • 解决方法:确保正则表达式和输入字符串使用相同的字符编码

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3 -- 项目配置之eslint【企业级项目配置保姆级教程1】

下面是项目级完整配置1➡eslint&#xff1a;【吐血分享&#xff0c;博主踩过的坑你跳过去&#xff01;&#xff01;跳不过去&#xff1f;太过分了给博主打钱】 浏览器自动打开项目&#xff1a; 你想释放双手吗&#xff1f;你想每天早上打开电脑运行完项目自动在浏览器打开吗&a…

【流量分析】常见webshell流量分析

免责声明&#xff1a;本文仅作分享&#xff01; 对于常见的webshell工具&#xff0c;就要知攻善防&#xff1b;后门脚本的执行导致webshell的连接&#xff0c;对于默认的脚本要了解&#xff0c;才能更清晰&#xff0c;更方便应对。 &#xff08;这里仅针对部分后门代码进行流量…

【MQTT.fx 客户端接入 阿里云平台信息配置】

1、打开界面&#xff0c;点击如下图⚙图标 2、点击左下角➕&#xff0c;添加新的配置&#xff0c;Profile Name 同阿里云平台设备名。 3、打开已经配置好的阿里云平台&#xff0c;进入设备信息界面&#xff0c;点击“MQTT连接参数”&#xff0c; 4、其他参数&#xff0c;对…

抽象java入门1.5.3.1——类的进阶

前言&#xff1a;在研究神技代码Hello word的时候&#xff0c;发现了一个重大公式bug&#xff0c;在代码溯源中&#xff0c;我发现了一个奇怪的东西&#xff0c;就是OUT不是类中类&#xff08;不是常规类的写法&#xff09; 内容总结&#xff1a; 代码运行的顺序复习 正片开始…

vue2+3 —— Day5/6

自定义指令 自定义指令 需求&#xff1a;当页面加载时&#xff0c;让元素获取焦点&#xff08;一进页面&#xff0c;输入框就获取焦点&#xff09; 常规操作&#xff1a;操作dom “dom元素.focus()” 获取dom元素还要用ref 和 $refs <input ref"inp" type&quo…

JAVA-链表

1.链表的概念及结构 链表是一种物理存储结构上非连续存储结构(逻辑上连续)&#xff0c;数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。 注意&#xff1a; 根据上图可看出&#xff0c;链表是在逻辑结构连续的&#xff0c;但是在物理结构上不一定现实中的结点一般都是通…

RTSP播放器EasyPlayer.js播放器UniApp或者内嵌其他App里面webview需要截图下载

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS、WEBRTC、FMP4视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方…

DB Type

P位 p 1时段描述符有效&#xff0c;p 0时段描述符无效 Base Base被分成了三个部分&#xff0c;按照实际拼接即可 G位 如果G 0 说明描述符中Limit的单位是字节&#xff0c;如果是G 1 &#xff0c;那么limit的描述的单位是页也就是4kb S位 S 1 表示代码段或者数据段描…

【Fargo】23:采集时间转rtp时间

RTP时间戳 编码会沿用当前时间,以毫秒计算,而rtp传输系统采用的是时间基准并不是当前时间RTP 时间戳为了多媒体不同流之间实现同步而设计的。Mediasoup的clockrate参数就是指定这个的 采集实现戳是当前时间uint32类型的毫秒,如果使用rtp发送h264编码的rtp包,时间戳要怎么打…

Android Osmdroid + 天地图 (一)

Osmdroid 天地图 前言正文一、配置build.gradle二、配置AndroidManifest.xml三、获取天地图的API Key① 获取开发版SHA1② 获取发布版SHA1 四、请求权限五、显示地图六、源码 前言 Osmdroid是一款完全开源的地图基本操作SDK&#xff0c;我们可以通过这个SDK去加一些地图API&am…

HTML5+CSS前端开发【保姆级教学】+新闻文章初体验

Hello&#xff0c;各位编程猿们&#xff01;上一篇文章介绍了前端以及软件的安装&#xff0c;这一篇我们要继续讲解页面更多知识点&#xff0c;教大家做一篇新闻题材的文章 新闻文章 当我们点开浏览器经常看到各种各样的文章&#xff0c;今天我们就来看看大家最喜欢关注的体育…

无人机动力系统测试-实测数据与CFD模拟仿真数据关联对比分析

我们经常被问到这样的问题&#xff1a;“我们计划运行 CFD 仿真&#xff0c;我们还需要对电机和螺旋桨进行实验测试吗&#xff1f;我们可能有偏见&#xff0c;但我们的答案始终是肯定的&#xff0c;而且有充分的理由。我们自己执行了大量的 CFD 仿真&#xff0c;但我们承认&…

【HarmonyOS】鸿蒙系统在租房项目中的项目实战(二)

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

深度学习神经网络创新点方向

一、引言 深度学习神经网络在过去几十年里取得了令人瞩目的成就&#xff0c;从图像识别、语音处理到自然语言理解等众多领域都有广泛应用。然而&#xff0c;随着数据量的不断增长和应用场景的日益复杂&#xff0c;对神经网络的创新需求也愈发迫切。本文将探讨深度学习神经网络…

C++析构函数详解

C析构函数详解&#xff1a;对象销毁与资源清理 在 C 中&#xff0c;析构函数是与构造函数相对应的特殊成员函数&#xff0c;它在对象生命周期结束时被自动调用&#xff0c;用于执行对象销毁之前的清理操作。析构函数主要用于释放对象占用的资源&#xff0c;如动态分配的内存、打…

Minikube 上安装 Argo Workflow

文章目录 步骤 1&#xff1a;启动 Minikube 集群步骤 2&#xff1a;安装Argo Workflow步骤 3&#xff1a;访问UI创建流水线任务参考 前提条件&#xff1a; Minikube&#xff1a;确保你已经安装并启动了 Minikube。 kubectl&#xff1a;确保你已经安装并配置了 kubectl&#xff…

计算机编程中的设计模式及其在简化复杂系统设计中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 计算机编程中的设计模式及其在简化复杂系统设计中的应用 计算机编程中的设计模式及其在简化复杂系统设计中的应用 计算机编程中的…

基于 CentOS7.6 的 Docker 下载常用的容器(MySQLRedisMongoDB),解决拉取容器镜像失败问题

安装MySQL&Redis&MongoDB mysql选择是8版本&#xff0c;redis是选择4版本、mongoDB选择最新版&#xff0c;也可以根据自己的需要进行下载对应的版本&#xff0c;无非就是容器名:版本号 这样去拉去相关的容器镜像。如果你还不会在服务器中安装 docker&#xff0c;可以查…

【分布式】万字图文解析——深入七大分布式事务解决方案

分布式事务 分布式事务是指跨多个独立服务或系统的事务管理&#xff0c;以确保这些服务中的数据变更要么全部成功&#xff0c;要么全部回滚&#xff0c;从而保证数据的一致性。在微服务架构和分布式系统中&#xff0c;由于业务逻辑往往会跨多个服务&#xff0c;传统的单体事务…

SystemVerilog学习笔记(十一):接口

在Verilog中&#xff0c;模块之间的通信是使用模块端口指定的。 Verilog模块连接的缺点 声明必须在多个模块中重复。存在声明不匹配的风险。设计规格的更改可能需要修改多个模块。 接口 SystemVerilog引入了 interface 结构&#xff0c;它封装了模块之间的通信。一个 inter…