正则表达式语法详解(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.xdnf.cn/news/18541.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

DimensionX 部署笔记

目录 生成视频用CogVideoX-5b-I2V 推理代码&#xff1a; DimensionX 生成视频用CogVideoX-5b-I2V 推理代码&#xff1a; 可以生成&#xff0c;从左向右旋转的&#xff0c;也可以生成从上往下旋转的&#xff1a; import torch from diffusers import CogVideoXImageToVideo…

如何利用SAP低代码平台快速构建企业级应用?

SAP作为全球领先的企业管理软件解决方案提供商&#xff0c;一直致力于为企业提供全面且高效的业务管理工具。随着技术的快速发展&#xff0c;传统的开发方式已经无法满足企业在快速变化的市场环境下的需求。低代码开发平台应运而生&#xff0c;它通过简化应用程序的创建过程&am…

拉取docker镜像应急方法

发现许多docker hub镜像网址速度也慢得发指啦&#xff0c;如果想速度快点&#xff0c;可以考虑买个按量计费的公有云服务器&#xff0c;用他们的内网镜像&#xff0c;然后再导出&#xff0c;然后传到本地。 开通服务器 可以考虑个开通最低配的&#xff0c;这里我用的是腾讯的…

Ubuntu下的Eigen库的安装及基本使用教程

一、Eigen库介绍 简介 Eigen [1]目前最新的版本是3.4&#xff0c;除了C标准库以外&#xff0c;不需要任何其他的依赖包。Eigen使用的CMake建立配置文件和单元测试&#xff0c;并自动安装。如果使用Eigen库&#xff0c;只需包特定模块的的头文件即可。 基本功能 Eigen适用范…

Ansible一键部署Kubernetes集群

一、环境准备 主机 ip地址 角色 k8s-master 192.168.252.141 master k8s-node1 192.168.252.142 node k8s-node2 192.168.252.143 node 二、实战 Ansible部署 主节点安装Ansible yum -y install epel-release yum -y install ansible ansible --version 开启记…

Comfy UI Manager 自定义节点管理

在 Stable Diffusion Web UI 中&#xff0c;可以通过插件的方式&#xff0c;扩展更多的功能&#xff0c;如&#xff1a;tagger提示词反推、ControlNet 等。 同样的在 Comfy UI 中有类似的功能实现&#xff0c;不过在 Comfy UI 中叫做自定义节点。 通过安装自定义节点的方式&a…

第二十周:机器学习

目录 摘要 ABSTRACT 一、吴恩达机器学习exp2——逻辑回归 1、logistic函数 2、数据预处理 3、损失函数 4、梯度下降 5、设定评价指标 6、决策边界 7、正则化 二、动手深度学习pytorch——数据预处理 1、数据集读取 2、缺失值处理 3、转换为张量格式 总结 摘要…

从人-物到人-机再到人-AI

从 人-物 到 人-机 再到 人-AI &#xff0c;这一演化过程展现了人类与技术、工具的互动方式随着时代的发展而发生的深刻变化。这一变化不仅是技术进步的体现&#xff0c;更是社会、文化以及工作方式的根本转变。以下是这一演变的主要特点及其背后的影响&#xff1a; 1. 人-物时…

go-zero(三) 数据库操作

go-zero 数据库操作 在本篇文章中&#xff0c;我们将实现一个用户注册和登录的服务。我们将为此构建一个简单而高效的 API&#xff0c;包括请求参数和响应参数的定义。 一、Mysql连接 1. 创建数据库和表 在 MySQL 中创建名为 test_zero的数据库&#xff0c;并创建user 表 …

【ASR技术】WhisperX安装使用

介绍 WhisperX 是一个开源的自动语音识别&#xff08;ASR&#xff09;项目&#xff0c;由 m-bain 开发。该项目基于 OpenAI 的 Whisper 模型&#xff0c;通过引入批量推理、强制音素对齐和语音活动检测等技术。提供快速自动语音识别&#xff08;large-v2 为 70 倍实时&#xf…

【C++ 算法进阶】算法提升十六

目录 背包问题变种 &#xff08;动态规划&#xff09;题目题目分析 连续可组成数字题目题目分析 min-patches题目 最小补丁问题题目分析代码 逆序对个数 &#xff08;归并排序&#xff09;题目题目分析 约瑟夫环问题 &#xff08;公式&#xff09;题目题目分析 背包问题变种 &a…

链表的基本操作

链表&#xff0c;由若干个结点组成&#xff0c;每个结点包含数据域和指针域。结点结构如下图所示&#xff1a; 一般来讲&#xff0c;链表中只会有一个结点的指针域为空&#xff0c;该结点为尾结点&#xff0c;其他结点的指针域都会存储一个结点的内存地址。链表中也只会有一个结…

C#高级:Winform中的自定义窗体输入

目录 一、多样式输入&#xff08;无封装&#xff09; 1.代码 2.效果 二、单输入框封装 1.使用 2.封装 3.效果 三、组合框批量输入封装 1.使用 2.封装 3.效果 一、多样式输入&#xff08;无封装&#xff09; 1.代码 private async void button1_Click(object send…

memblock内存分配器

一、简述 memblock 是 Linux 内核中的一个内存管理子系统&#xff0c;主要用于在系统启动早期阶段管理物理内存。它在内核初始化期间负责管理内存&#xff0c;直到更复杂的内存管理子系统&#xff08;如伙伴系统&#xff09;接管。 二、工作原理 初始化&#xff1a;在内核启…

【C++滑动窗口】1248. 统计「优美子数组」|1623

本文涉及的基础知识点 C算法&#xff1a;滑动窗口及双指针总结 LeetCode1248. 统计「优美子数组」 给你一个整数数组 nums 和一个整数 k。如果某个连续子数组中恰好有 k 个奇数数字&#xff0c;我们就认为这个子数组是「优美子数组」。 请返回这个数组中 「优美子数组」 的数…

⽂件内容的读写

文件 InputStream &#xff08;字节流读出 抽象类&#xff09; InputStream 只是⼀个抽象类&#xff0c;要使⽤还需要具体的实现类 FileInputStream&#xff08;字节流读出&#xff09; OutputStream&#xff08;字节流写入&#xff09; Reader&#xff08;字符流读入&#xff…

FreeRTOS消息队列实验与出现的问题

目录 实验名字&#xff1a;队列操作实验 1、实验目的 2、实验设计 3、实验工程 4、实验程序与分析 ●任务设置 ● 其他应用函数 ● main()函数 ● 任务函数 ●中断初始化及处理过程 5.程序运行结果分析 6.进行实验移植时所遇到的问题 1.项目中mymalloc等函数缺少 …

el-cascader 使用笔记

1.效果 2.官网 https://element.eleme.cn/#/zh-CN/component/cascader 3.动态加载&#xff08;官网&#xff09; <el-cascader :props"props"></el-cascader><script>let id 0;export default {data() {return {props: {lazy: true,lazyLoad (…

Linux之进程概念(2)

Linux之进程概念&#xff08;2&#xff09; 孤儿进程 父进程如果提前退出&#xff0c;那么子进程后退出&#xff0c;进入Z之后&#xff0c;那该如何处理呢&#xff1f; 父进程先退出&#xff0c;子进程就称之为“孤儿进程” 孤儿进程被1号init进程领养&#xff0c;当然要有in…

1+X应急响应(网络)日志分析:

日志分析&#xff1a; Web日志分析&#xff1a; http协议&#xff1a; http版本演变&#xff1a; http协议工作原理&#xff1a; http协议的特点&#xff1a; http请求报文&#xff1a; http请求方法&#xff1a; http响应报文&#xff1a; UserId&#xff1a;注册网站的序列号…