python——正则表达式
一、简介
在 Python 中,正则表达式主要通过 re 模块实现,用于字符串的匹配、查找、替换等操作。
二、Python的re模块
使用前需要导入:
import re
三、常用方法
| 方法 | 描述 |
|---|---|
re.match(pattern, string) | 从字符串开头匹配,返回第一个匹配对象,否则返回 None |
re.search(pattern, string) | 扫描整个字符串,返回第一个匹配对象,否则返回 None |
re.findall(pattern, string) | 返回所有匹配的子字符串列表 |
re.finditer(pattern, string) | 返回所有匹配的迭代器(包含匹配对象) |
re.sub(pattern, repl, string) | 将匹配的子字符串替换为 repl |
re.split(pattern, string) | 按匹配模式分割字符串,返回列表 |
1、搜索匹配:re.search(pattern, string)
text = "订单号:ABC123 金额:¥99.8"
if re.search(r'\d+\.\d+', text): # 检查是否有小数print("发现金额")
2、查找所有匹配项:re.findall(pattern, string)
emails = "联系:a@x.com, b@y.cn"
print(re.findall(r'\w+@\w+\.\w+', emails)) # 输出 ['a@x.com', 'b@y.cn']
(1)正则表达式拆解 \w+@\w+\.\w+
-
\w+:匹配用户名部分-
\w= 字母/数字/下划线(等价于[a-zA-Z0-9_]) -
+= 至少出现1次 -
示例:匹配 "a"、"user123"
-
-
@:直接匹配邮箱符号 -
\w+:匹配域名主体-
示例:匹配 "x"、"google"
-
-
\.:转义匹配真实的点(.)-
注意:不加反斜杠的
.会匹配任意字符
-
-
\w+:匹配顶级域名-
示例:匹配 "com"、"cn"
-
(2)匹配过程演示
以第一个邮箱 "a@x.com" 为例:
原始字符串:联系:a@x.com, b@y.cn↑开始匹配|------------------|匹配流程:\w+ → "a" @ → 匹配@符号 \w+ → "x" \. → 匹配点 \w+ → "com"
3、替换文本:re.sub(pattern, replacement, string)
text = "2023-08-15"
new_text = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1', text) # 改为 "08/15/2023"
(1) 正则表达式分解 (\d{4})-(\d{2})-(\d{2})
python
-
(\d{4}):捕获年(4位数字)-
示例:匹配 "2023"
-
-
-:匹配日期分隔符(原格式的短横线) -
(\d{2}):捕获月(2位数字)-
示例:匹配 "08"
-
-
-:再次匹配分隔符 -
(\d{2}):捕获日(2位数字)-
示例:匹配 "15"
-
(2)分组编号:
-
第1组:年(
\1) -
第2组:月(
\2) -
第3组:日(
\3)
(3)替换逻辑 r'\2/\3/\1'
替换字符串中的 \数字 对应正则中的分组:
-
\2→ 第2组(月) -
\3→ 第3组(日) -
\1→ 第1组(年)
(4)关键细节
分组顺序:括号从左到右编号,与位置无关
# 错误示范:错误的分组顺序
re.sub(r'(\d{2})-(\d{2})-(\d{4})', r'\3/\1/\2', "15-08-2023") # 正确写法
保留原格式:替换时仅调整分组顺序,不修改内容
# 原始内容中的"08"会被直接引用为\2
分隔符变化:将短横线 - 改为斜杠 /
# 替换字符串中的"/"是普通字符,无需转义
四、核心元字符速查表
| 符号 | 含义 | 等价写法 | 示例 |
|---|---|---|---|
\d | 任意数字 (0-9) | [0-9] | \d+ 匹配 "123" |
\D | 非数字字符 | [^0-9] | \D+ 匹配 "abc" |
\w | 单词字符(字母/数字/下划线) | [a-zA-Z0-9_] | \w+ 匹配 "user123" |
\W | 非单词字符 | [^\w] | \W+ 匹配 "@#$" |
\s | 空白字符(空格、换行、制表符等) | [ \t\n\r\f\v] | \s+ 匹配 " \t" |
\S | 非空白字符 | [^\s] | \S+ 匹配 "Hello" |
. | 任意字符(默认不包含换行) | — | a.c 匹配 "abc" 或 "a c" |
^ | 脱字符 | —— | re.search(r'^Hello', 'Hello World') → 匹配成功 |
$ | 美元符 | —— | re.search(r'World$', 'Hello World') → 匹配成功 |
1、自定义字符集合
用方括号 [] 自定义匹配范围:
(1)匹配特定字符
# 匹配元音字母
re.findall(r'[aeiou]', "hello") # ['e', 'o']# 匹配数字或小写字母
re.search(r'[0-9a-z]', "ID: A3") # 匹配 "3"
(2)排除特定字符
在 [] 中使用 ^ 表示排除:
# 匹配非数字字符
re.findall(r'[^0-9]', "R2D2") # ['R', 'D']
(3) 组合范围
# 匹配十六进制字符(0-9, A-F)
re.findall(r'[0-9A-Fa-f]', "Hex: 1aF") # ['1', 'a', 'F']
2、特殊字符处理
(1)转义符号
匹配正则中的特殊符号(如 .、*)时,需用 \ 转义:
# 匹配浮点数中的点
re.search(r'\d+\.\d+', "价格 9.99") # 匹配 "9.99"
(2) Unicode 字符(如中文)
Python 的 re 模块默认支持 Unicode:
# 匹配中文字符
re.findall(r'[\u4e00-\u9fa5]+', "Hello 你好!") # ['你好']
五、量词控制重复次数
| 量词 | 含义 | 示例 | 行为说明 |
|---|---|---|---|
* | 0次或多次 | a* 匹配 "", "a", "aaa" | 尽可能多匹配(贪婪模式) |
+ | 1次或多次 | \d+ 匹配 "1", "123" | 至少出现一次 |
? | 0次或1次 | colou?r 匹配 "color"/"colour" | 可选匹配 |
{n} | 精确n次 | \d{4} 匹配4位数字 | 如年份匹配 |
{n,} | 至少n次 | \w{3,} 匹配3个以上字母数字 | 如密码长度验证 |
{n,m} | n到m次 | \d{2,4} 匹配2-4位数字 | 范围控制 |
1、自定义字符集 []
# 匹配元音字母
re.findall(r'[aeiou]', 'hello') # ['e', 'o']# 匹配十六进制字符(0-9, a-f)
re.search(r'[0-9a-fA-F]+', 'Color: #FF00FF') # 匹配 "#FF00FF"
2、排除字符集 [^]
# 匹配非数字字符
re.findall(r'[^0-9]', 'R2-D2') # ['R', '-', 'D']
3、逻辑或 |
# 匹配多种日期格式
pattern = r'\d{4}-\d{2}-\d{2}|\d{2}/\d{2}/\d{4}'
re.findall(pattern, '2023-08-15 或 08/15/2023') # 匹配两者
4、捕获组 ()
# 提取日期各部分
date = '2023-08-15'
match = re.search(r'(\d{4})-(\d{2})-(\d{2})', date)
print(match.groups()) # ('2023', '08', '15')
5、反向引用 \n
# 查找重复单词
re.findall(r'\b(\w+)\b\s+\1\b', 'hello hello world') # ['hello']
6、 非捕获组 (?:)
# 匹配但不捕获组
re.findall(r'(?:Mr|Ms)\. (\w+)', 'Mr. Smith, Ms. Lee') # ['Smith', 'Lee']
六、实战技巧
1、匹配手机号
phone = "138-1234-5678"
match = re.search(r'1[3-9]\d-?\d{4}-?\d{4}', phone)
if match:print(f"找到手机号:{match.group()}")
2、提取网页链接
html = '<a href="https://example.com">点击这里</a>'
links = re.findall(r'href="(https?://[^"]+)"', html) # ['https://example.com']
3、密码强度验证
要求:8-20位,必须包含字母和数字
password = "Passw0rd"
if re.fullmatch(r'(?=.*\d)(?=.*[a-zA-Z]).{8,20}', password):print("密码有效")
七、补充
1、在正则表达式中,使用 ^ 来匹配字符串的开头。
2、在正则表达式中,使用 $ 来匹配字符串结尾。
相关文章:
python——正则表达式
一、简介 在 Python 中,正则表达式主要通过 re 模块实现,用于字符串的匹配、查找、替换等操作。 二、Python的re模块 使用前需要导入: import re 三、常用方法 方法描述re.match(pattern, string)从字符串开头匹配,返回第一个匹…...
Flutter Invalid constant value.
0x00 问题 参数传入变量,报错! 代码 const Padding(padding: EdgeInsets.all(20),child: GradientProgressIndicator(value: _progress), ),_progress 参数报错:Invalid constant value. 0x01 原因 这种情况,多发生于ÿ…...
libev实现Io复用及定时器事件服务器
客户端和服务器都绑定在了enp2s0网卡,需要SERVER_IP和SERVER_PORT改为其ip,注意不能是127.0.0.1,因为这个是lo虚拟网口。 安装libev sudo apt-get install libev-dev客户端: #include <iostream> #include <string>…...
【精品PPT】2025固态电池知识体系及最佳实践PPT合集(36份).zip
精品推荐,2025固态电池知识体系及最佳实践PPT合集,共36份。供大家学习参考。 1、中科院化学所郭玉国研究员:固态金属锂电池及其关键材料.pdf 2、中科院物理所-李泓固态电池.pdf 3、全固态电池技术研究进展.pdf 4、全固态电池生产工艺.pdf 5、…...
如何计算设备电池工作时长?
目录 【mAh(毫安时)计算方法】 【Wh(瓦时)计算方法】 【为什么仅用电流(mA)和时间(h)就能计算电池使用时长(mAh)?】 1. mAh 的本质是“电荷量…...
抽象类及其特性
目录 1、概念2、语法3、特性4、作用 1、概念 在面向对象中,所有对象都是通过类来描述的,但是并不是所有的类都可以用来描述对象。比如下述例子中的 Animal 类,Dog 类和 Cat 类是 Animal 类的子类,可以分别描述小狗和小猫…...
【教程】xrdp修改远程桌面环境为xfce4
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 xfce4 vs GNOME对比 配置教程 1. 安装 xfce4 桌面环境 2. 安装 xrdp 3. 配置 xrdp 使用 xfce4 4. 重启 xrdp 服务 5. 配置防火墙ÿ…...
利用python从零实现Byte Pair Encoding(BPE):NLP 中的“变形金刚”
BPE:NLP 界的“变形金刚”,从零开始的奇幻之旅 在自然语言处理(NLP)的世界里,有一个古老而神秘的传说,讲述着一种强大的魔法——Byte Pair Encoding(BPE)。它能够将普通的文本“变形…...
部署redis cluster
一。在所有的主机里面设置密码和文件地址 vi /etc/redis/6379.conf 注释:登陆则要使用auth 123456才可以进入redis 配置文件地址和超时时间 二。创建集群:上面主机为master,下面为slave,master和slave会随机分配 先写主节点&…...
Android 11 (API 30) 及更高版本中,查询的特定应用商店包,无需动态请求权限处理
在 Android 11 (API 30) 及更高版本中,通过在 AndroidManifest.xml 中添加 <queries> 元素声明需要查询的特定应用商店包名后: 1. 不需要额外请求权限 (如 QUERY_ALL_PACKAGES )即可查询这些应用的安装状态 2. 这是 Googl…...
基于springboot钻孔数据管理系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
摘要 本钻孔数据管理系统采用B/S架构,数据库是MySQL,网站的搭建与开发采用了先进的Java语言、Hadoop、数据可视化技术进行编写,使用了Spring Boot框架。该系统从两个对象:由管理员和用户来对系统进行设计构建。用户主要功能包括&…...
SpringBoot和微服务学习记录Day2
微服务 微服务将单体应用分割成更小的的独立服务,部署在不同的服务器上。服务间的关联通过暴露的api接口来实现 优点:高内聚低耦合,一个模块有问题不影响整个应用,增加可靠性,更新技术方便 缺点:增加运维…...
4.9复习记
1.地宫取宝--记忆化搜索,可以先写void dfs,然后在改成ll 形式的,边界条件return 0/1; 记忆化数组与dfs元素保持一致,记得记忆化剪枝 这个题特殊在value可能是0,不取的时候应该记为-1 https://mpbeta.cs…...
LinuxSocket套接字编程
1.介绍函数使用 1.创建套接字 int socket(int domain, int type, int protocol); domain:指定协议族,如AF_INET(IPv4)或AF_INET6(IPv6)。 type:指定套接字类型,如SOCK_DGRAM&#…...
动态科技感html导航网站源码
源码介绍 动态科技感html导航网站源码,这个设计完美呈现了科幻电影中的未来科技界面效果,适合展示技术类项目或作为个人作品集的入口页面,自适应手机。 修改卡片中的链接指向你实际的HTML文件可以根据需要调整卡片内容、图标和颜色要添加更…...
Java进阶版线程池(超详细 )
线程池 线程池工具类 Executors Executors 是 Java 提供的一个工具类,它包含了多个静态方法,能够方便地创建不同类型的线程池。 newFixedThreadPool 创建一个固定大小的线程池,线程池中的线程数量固定,当有新任务提…...
每日算法:洛谷U535992 J-C 小梦的宝石收集(双指针、二分)
题目描述 小梦有 n 颗能量宝石,其中第 i 颗的能量为 ai,但这些能量宝石十分不稳定,随时有可能发生崩坏,导致他们全部消失! 小梦想要留住宝石们,不希望他们发生崩坏,同时他发现:如…...
YOLOv11训练中精准率召回率与mAP@0.5的动态变化分析
目标检测模型的训练过程涉及多个关键性能指标和损失函数的变化,这些数据能够直观反映模型的收敛速度、最终精度以及改进效果。本文旨在通过绘制YOLOv11模型在训练过程中的精准率(Precision)、召回率(Recall)、mAP0.5 、…...
Java常用工具算法-6--秘钥托管云服务AWS KMS
前言: 之前我们介绍了一些常用的加密算法(如:对称加密AES,非对称加密RSA,ECC等),不论是哪一种都需要涉及到秘钥的管理。通常的做法都是把秘钥放到配置文件中进行配置,但是对于一些高…...
11. Langchain输出解析(Output Parsers):从自由文本到结构化数据
引言:从"自由发挥"到"规整输出" 2025年某金融机构的合同分析系统升级前,AI生成的合同摘要需人工二次处理达47分钟/份。引入LangChain结构化解析后,处理时间缩短至3分钟。本文将详解如何用LangChain的解析器,…...
docker stack常用命令
1、Docker Stack介绍 Docker Stack管理swarm堆栈与Swarm协调器配合使用,是Docker Swarm环境中用于管理一组相关服务的工具。它使得在Swarm集群中部署、管理和扩展一组相互关联的服务变得简单。主要用于定义和编排容器化应用的多个服务。以下是Docker Stack的一些关…...
python reportlab模块----操作PDF文件
reportlab模块----操作PDF文件 一. 安装模块二. reportlab相关介绍三. 扩展canvas类四. 水平写入完整代码五. 垂直写入完整代码 一. 安装模块 pip install reportlab二. reportlab相关介绍 # 1. letter 生成A4纸张尺寸 from reportlab.lib.pagesizes import letter print(let…...
解锁基因密码之重测序(从测序到分析)
在生命科学的奇妙世界中,基因恰似一本记录着生命奥秘的“天书”,它承载着生物体生长、发育、衰老乃至疾病等一切生命现象的关键信息。而重测序技术,则是开启基因“天书”奥秘的一把神奇钥匙。 试想,你手中有一本经典书籍的通用版…...
TQTT_KU5P开发板教程---QSFP25G光口回环测试
文档实现功能介绍 本文档通过一个叫做ibert的IP,实现25G光口回环测试例子。工程新建方法请参考文档《流水灯》,其中只是将文件名进行修改。 Vivado 起始页(或 file-->Project-->New 创建新工程(Create New Project) 向导起始页面 点…...
JVM虚拟机篇(七):JVM垃圾回收器全面解析与G1深度探秘及四种引用详解
JVM垃圾回收器全面解析与G1深度探秘及四种引用详解 JVM虚拟机(七):JVM垃圾回收器全面解析与G1深度探秘及四种引用详解一、JVM有哪些垃圾回收器1. Serial回收器2. ParNew回收器3. Parallel Scavenge回收器4. Serial Old回收器5. Parallel Old回…...
柑橘病虫害图像分类数据集OrangeFruitDaatset-8600
文章目录 1. 前言2. 数据类别介绍3. 数据集地址 1. 前言 柑橘,作为水果界的 “宠儿”,不仅以其酸甜可口的味道深受大众喜爱,更是在全球水果产业中占据着举足轻重的地位。无论是早餐中的一杯橙汁,还是下午茶里的柑橘甜点ÿ…...
深度学习总结(4)
张量积 张量积(tensor product)或点积(dot product)是最常见且最有用的张量运算之一。注意,不要将其与逐元素乘积(*运算符)弄混。在NumPy中,使用np.dot函数来实现张量积,…...
利用CST Microwave Studio设计贴片天线
利用CST Microwave Studio设计贴片天线的步骤如下,分为几个关键阶段: --- ### **1. 初始设置** - **新建项目**:打开CST,创建新项目(File > New),选择“Antenna (Planar)”或“Microwave &…...
STM32之SG90舵机控制(附视频讲解)
目录 前言: 一、硬件准备与接线 1.1 硬件清单 1.2 接线 二、 SG90舵机简介 1.1 外观 1.2 基本参数 1.3 引脚说明 1.4 控制原理 1.5 特点 1.6 常见问题 三、 单片机简介 四、 程序设计 4.1 定时器配置 4.2 角度控制函数 4.3 主函数调用 五、 总结 …...
(1)英特尔 RealSense T265(三)
文章目录 前言 4.4 地面测试 4.5 飞行测试 4.6 室内外实验 4.7 数据闪存记录 4.8 启动时自动运行 4.9 使用 OpticalFlow 进行 EKF3 光源转换 前言 Realsense T265 通过 librealsense 支持 Windows 和 Linux 系统。不同系统的安装过程差异很大,因此请参阅 gi…...
