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组:年(\1

  2. 第2组:月(\2

  3. 第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、在正则表达式中,使用 $ 来匹配字符串结尾。

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

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

相关文章

Soybean Admin 配置vite兼容低版本浏览器、安卓电视浏览器(飞视浏览器)

环境 window10 pnpm 8.15.4 node 8.15.4 vite 5.1.4 soybean admin: 1.0.0 native-ui: 2.38.0 小米电视 MIUI TV版本&#xff1a;MiTV OS 2.7.1886(稳定版) 飞视浏览器&#xff1a;https://www.fenxm.com/1220.html在小米电视安装飞视浏览器可以去小红书查安装教程&#xff1a…

系统与网络安全------网络通信原理(1)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 文章目录 网络通信模型协议分层计算机网络发展计算机网络功能什么是协议为什么分层邮局实例 OSI模型OSI协议模型OSI七层模型OSI七层的功能简介 TCP/IP模型OSI模型与TCP/IP模型TCP/IP协议族的组成各层PDU设备与…

如何使用通义灵码完成PHP单元测试 - AI辅助开发教程

一、引言 在软件开发过程中&#xff0c;测试是至关重要的一环。然而&#xff0c;在传统开发中&#xff0c;测试常常被忽略或草草处理&#xff0c;很多时候并非开发人员故意为之&#xff0c;而是缺乏相应的测试思路和方法&#xff0c;不知道如何设计测试用例。随着 AI 技术的飞…

批量清空图片的相机参数、地理位置等敏感元数据

我们在使用相机或者手机拍摄照片的时候&#xff0c;照片中都会带有一些敏感元数据信息&#xff0c;比如说相机的型号&#xff0c;参数&#xff0c;拍摄的时间地点等等。这些信息虽说不是那么引人注意&#xff0c;但是在某些时候他是非常隐私非常重要的。如果我们将这些信息泄露…

SQL优化算法解析 | PawSQL 如何将EXISTS子查询“秒拆“为JOIN连接

在数据库性能调优中,子查询优化是提升查询效率的关键点之一。今天,我们将分享一个使用 PawSQL 对EXISTS子查询进行重写优化的案例,展示如何通过合理的SQL重写与索引设计,实现超过487516.45%的性能提升! 一、案例分析&#xff1a;EXISTS子查询的性能困境 这个查询的目的是找出…

大模型day1 - 什么是GPT

什么是GPT 全称 Generative Pre-trained Transformer 是一种基于 Transformer 架构的大规模 预训练 语言模型&#xff0c;由OpenAI研发&#xff0c;但GPT仅仅只是借鉴了Transformer 中 Decoder 的部分&#xff0c;并且做了升级 Transformer 架构 Transformer架构 是一种用于…

MDM功能演示:远程锁定与数据擦除,保障企业移动设备安全

在当今高度互联的商业环境中&#xff0c;企业数据伴随着员工穿梭于不同城市、时区和设备之间。智能手机、平板电脑和笔记本电脑赋予员工随时随地办公的能力&#xff0c;但也带来了新的安全挑战&#xff1a;设备一旦遗失或落入不当之手&#xff0c;企业数据就面临泄露风险。 无…

深度集成学习不均衡样本图像分类

用五个不同的网络&#xff0c;然后对分类概率进行平均&#xff0c;得到分类结果。基本上分类精度可以提升10% 1.导入基本库 import torch import copy import torch.nn as nn import torchvision.models as models from torchvision import datasets from torchvision import…

从零开始学java--泛型

泛型 目录 泛型 引入 泛型类 泛型与多态 泛型方法 泛型的界限 类型擦除 函数式接口 Supplier供给型函数式接口&#xff1a; Consumer消费型函数式接口&#xff1a; Function函数型函数式接口&#xff1a; Predicate断言式函数式接口&#xff1a; 判空包装 引入 …

5️⃣ Coze+AI应用基础教学(2025年全新版本)

目录 一、了解应用开发 1.1 扣子应用能做什么 1.2 开发流程 1.3 开发环境 二、快速搭建一个AI应用 2.1 AI翻译应用介绍 2.2 设计你的应用功能 2.3 创建 AI 应用项目 2.4 编写业务逻辑(新建工作流) 2.5 搭建用户界面 2.6 效果测试 2.7 发布应用 一、了解应用开发 …

工会成立100周年纪念,开发职工健身AI运动小程序、APP方案推荐

时光荏苒&#xff0c;转眼间2025年五一将至&#xff0c;这一年对于中华全国总工会而言&#xff0c;具有非凡的历史意义——它将迎来成立100周年的辉煌时刻。为了庆祝这一盛事&#xff0c;各级工会组织将精心筹备了一系列丰富多彩、形式多样的纪念活动&#xff0c;旨在展现工会百…

【深度学习】Ubuntu 服务器配置开源项目FIGRET(PyTorch、torch-scatter、torch-sparse、Gurobi 安装)

开源项目网址&#xff1a;https://github.com/FIGRET/figret 该项目在SIGCOMM2024发表&#xff0c;用深度学习方法处理流量工程中的突发问题 1. 创建新的 Conda 环境 使用国内镜像源创建环境​ conda create -n figret python3.8.0 --override-channels -c https://mirrors.…

【SpringCloud】从入门到精通(上)

今天主播我把黑马新版微服务课程MQ高级之前的内容都看完了&#xff0c;虽然在看视频的时候也记了笔记&#xff0c;但是看完之后还是忘得差不多了&#xff0c;所以打算写一篇博客再温习一下内容。 课程坐标:黑马程序员SpringCloud微服务开发与实战 微服务 认识单体架构 单体架…

MySQL中动态生成SQL语句去掉所有字段的空格

在MySQL中动态生成SQL语句去掉所有字段的空格 在数据库管理过程中&#xff0c;我们常常会遇到需要对表中字段进行清洗和整理的情况。其中&#xff0c;去掉字段中的空格是一项常见的操作。当表中的字段数量较少时&#xff0c;我们可以手动编写 UPDATE 语句来处理。但如果表中包…

【Grok 大模型深度解析】第二期:架构探秘与训练哲学

在上一期的内容中,我们对 Grok 大模型从技术溯源的角度,了解了它从 Transformer 架构局限性出发,迈向混合架构创新的历程,同时也梳理了从 Grok - 1 到 Grok - 3 的版本迭代所带来的技术跃迁以及其独特的差异化优势。这一期,我们将深入到 Grok 大模型的架构内部,探究其精妙…

c# 使用NPOI将datatable的数据导出到excel

以下是使用 NPOI 库 将 DataTable 数据导出到 Excel 的详细步骤和代码示例(支持 .xls 和 .xlsx 格式): 步骤 1:安装 NPOI NuGet 包 Install-Package NPOI Install-Package NPOI.OOXML # 若需导出 .xlsx 格式 步骤 2:完整代码实现 using NPOI.SS.UserModel; using NPOI.…

基于SpringBoot的求职招聘网站系统(源码+数据库)

473基于SpringBoot的求职招聘网站系统&#xff0c;本系统共分为2个角色&#xff1a;系统管理员、用户&#xff0c;主要功能如下 【前台功能】 用户角色功能&#xff1a; 1. 注册和登录&#xff1a;注册账户并登录系统&#xff0c;以便访问更多功能。 2. 个人信息管理&#x…

CSS 过渡与变形:让交互更丝滑

在网页设计中&#xff0c;动效能让用户交互更自然、流畅&#xff0c;提升使用体验。本文将通过 CSS 的 transition&#xff08;过渡&#xff09;和 transform&#xff08;变形&#xff09;属性&#xff0c;带你入门基础动效设计&#xff0c;结合案例演示如何实现颜色渐变、元素…

rqlite:一个基于SQLite构建的分布式数据库

今天给大家介绍一个基于 SQLite 构建的轻量级分布式关系型数据库&#xff1a;rqlite。 rqlite 基于 Raft 协议&#xff0c;结合了 SQLite 的简洁性以及高可用分布式系统的稳健性&#xff0c;对开发者友好&#xff0c;操作极其简便&#xff0c;其核心设计理念是以最低的复杂度实…

mujoco graspnet 仿真项目的复现记录

开源项目&#xff1a;https://gitee.com/chaomingsanhua/manipulator_grasp 复现使用的配置&#xff1a;linux系统ubuntu20.04 项目配置记录&#xff1a; git clone 对应的code后&#xff1a; 需要在graspnet-baseline文件夹中继续拉取文件&#xff0c;指令记录&#xff1a;…