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

Python 正则表达式模块 re

Python 正则表达式模块 re

flyfish

一、正则表达式基础

1. 什么是正则表达式?

正则表达式(Regular Expression, RE)是一种用于匹配、查找和替换文本模式的工具,由普通字符(如字母、数字)和特殊字符(元字符)组成。

2. 常用元字符
元字符说明示例
.匹配任意单个字符(除换行符)a.cabc, adc
\w匹配字母、数字或下划线\w+hello123
\d匹配数字\d{3}123
\s匹配空白字符(空格、制表符等)\s+ → 多个空格
*匹配前一个字符零次或多次ab*a, ab, abb
+匹配前一个字符一次或多次ab+ab, abb
?匹配前一个字符零次或一次ab?aab
^匹配字符串开头^abc → 以abc开头
$匹配字符串结尾abc$ → 以abc结尾

二、Python 正则表达式模块 re

1. 模块导入
import re
2. 常用函数
函数名作用描述
re.compile()编译正则表达式,提高重复使用效率
re.match()从字符串开头匹配模式
re.search()在字符串任意位置搜索模式
re.findall()查找所有匹配项,返回列表
re.finditer()查找所有匹配项,返回迭代器
re.sub()替换匹配项
re.subn()替换匹配项并返回替换次数
re.split()按模式分割字符串
re.fullmatch()要求整个字符串完全匹配模式

三、核心功能详解

1. 匹配操作
  • re.match()(从开头匹配)
    match = re.match(r'hello', 'hello world')
    print(match.group())  # 输出: hello
    

match = re.search(r'```json(.*?)```', content, re.DOTALL)

re.search() 函数

re.search(pattern, string, flags=0)re 模块中的一个函数,用于在字符串 string 中搜索第一个与模式 pattern 匹配的子字符串。如果找到匹配项,则返回一个匹配对象;如果没有找到,则返回 None

  • pattern:要搜索的正则表达式模式。
  • string:要在其中进行搜索的字符串,这里是 content
  • flags:可选参数,用于指定正则表达式的匹配模式。这里使用了 re.DOTALL
正则表达式模式 r'```json(.*?)```'
  • r:在字符串前面加上 r 表示这是一个原始字符串。在原始字符串中,反斜杠 \ 不会被当作转义字符处理,这样可以避免在编写正则表达式时出现过多的转义字符,提高代码的可读性。
  • json ````:这是一个普通的字符串,表示匹配以 json ````开头的文本。
  • (.*?):这是一个捕获组,用于匹配任意字符(除换行符外,除非使用了 re.DOTALL 标志)。
    • .:匹配除换行符外的任意单个字符。
    • *:表示前面的字符(即 .)可以出现零次或多次。
    • ?:在 * 后面加上 ? 表示非贪婪匹配。贪婪匹配会尽可能多地匹配字符,而非贪婪匹配会尽可能少地匹配字符。例如,如果字符串中有多个 json...代码块,非贪婪匹配会只匹配到第一个 ```````````就停止。
  • :表示匹配以 结尾的文本。
re.DOTALL 标志

re.DOTALLre 模块中的一个标志,它会改变 . 的匹配行为。默认情况下,. 不匹配换行符,但使用 re.DOTALL 后,. 可以匹配包括换行符在内的任意字符。这意味着代码块中可以包含换行符,能够正确匹配多行的 JSON 代码块。

  • re.search()(全局搜索)
    search = re.search(r'world', 'hello world')
    print(search.group())  # 输出: world
    
2. 查找所有匹配项
  • re.findall()
    numbers = re.findall(r'\d+', 'a123b456c')
    print(numbers)  # 输出: ['123', '456']
    
3. 替换操作
  • re.sub()
    text = re.sub(r'\d+', 'X', 'a123b456c')
    print(text)  # 输出: aXbXc
    
4. 分割字符串
  • re.split()
    parts = re.split(r'\s+', 'hello   world')
    print(parts)  # 输出: ['hello', 'world']
    

四、捕获组与 group() 方法

1. 基本用法
pattern = r'(\d{4})-(\d{2})-(\d{2})'
date_str = '2025-03-11'
match = re.search(pattern, date_str)print(match.group(0))  # 完整匹配结果 → '2025-03-11'
print(match.group(1))  # 第一个捕获组 → '2025'
print(match.group(2))  # 第二个捕获组 → '03'
print(match.group(3))  # 第三个捕获组 → '11'
2. 查看捕获组数量
  • 使用 groups()
    groups = match.groups()
    print(len(groups))  # 输出: 3
    
  • 命名捕获组(使用 groupdict()
    pattern = r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'
    match = re.search(pattern, date_str)
    print(match.groupdict())  # 输出: {'year': '2025', 'month': '03', 'day': '11'}
    

五、re.match vs re.search

基本概念对比
  • re.match:该函数会从字符串的起始位置开始尝试匹配正则表达式模式。如果字符串的起始位置不符合模式,即使字符串的其他部分存在匹配内容,re.match 也会返回 None。也就是说,它要求模式必须从字符串的第一个字符开始匹配成功。
  • re.search:此函数会在整个字符串中进行搜索,查找与正则表达式模式匹配的第一个位置。只要字符串中存在一处符合模式的内容,re.search 就会返回一个匹配对象。
详细示例对比
示例 1:模式在字符串起始位置匹配
import re# 定义字符串和模式
pattern = r'hello'
string = 'hello world'# 使用 re.match
match_result = re.match(pattern, string)
if match_result:print("re.match 匹配成功,匹配内容为:", match_result.group())
else:print("re.match 匹配失败")# 使用 re.search
search_result = re.search(pattern, string)
if search_result:print("re.search 匹配成功,匹配内容为:", search_result.group())
else:print("re.search 匹配失败")

结果分析:在这个例子中,模式 'hello' 位于字符串 'hello world' 的起始位置。因此,re.matchre.search 都能成功匹配,并且都能返回匹配到的 'hello'

示例 2:模式不在字符串起始位置
import re# 定义字符串和模式
pattern = r'world'
string = 'hello world'# 使用 re.match
match_result = re.match(pattern, string)
if match_result:print("re.match 匹配成功,匹配内容为:", match_result.group())
else:print("re.match 匹配失败")# 使用 re.search
search_result = re.search(pattern, string)
if search_result:print("re.search 匹配成功,匹配内容为:", search_result.group())
else:print("re.search 匹配失败")

结果分析:模式 'world' 不在字符串 'hello world' 的起始位置,所以 re.match 会匹配失败,返回 None。而 re.search 会在整个字符串中搜索,能够找到 'world' 并返回匹配对象,输出匹配内容 'world'

示例 3:模式部分在起始位置但不完全匹配
import re# 定义字符串和模式
pattern = r'hello world!'
string = 'hello world'# 使用 re.match
match_result = re.match(pattern, string)
if match_result:print("re.match 匹配成功,匹配内容为:", match_result.group())
else:print("re.match 匹配失败")# 使用 re.search
search_result = re.search(pattern, string)
if search_result:print("re.search 匹配成功,匹配内容为:", search_result.group())
else:print("re.search 匹配失败")

结果分析:模式 'hello world!' 虽然前部分 'hello world' 与字符串起始部分相同,但整体模式不完全匹配,所以 re.match 会失败。re.search 同样在整个字符串中找不到完全匹配的内容,也会匹配失败。

性能考虑
  • re.match:由于它只从字符串起始位置开始匹配,不需要对整个字符串进行遍历,在某些情况下性能可能会更好,特别是当你明确知道要匹配的内容应该在字符串开头时。
  • re.search:需要遍历整个字符串来查找匹配位置,所以在处理较长字符串时,性能可能会相对较低。但它的灵活性更高,适用于不确定匹配内容位置的情况。

六、正则表达式 re 模块的常用例子

1. 匹配以特定字符开头的字符串

import retext = "apple banana cherry"
pattern = r'^apple'
result = re.search(pattern, text)
if result:print("匹配成功:", result.group())
else:print("匹配失败")

2. 匹配以特定字符结尾的字符串

import retext = "apple banana cherry"
pattern = r'cherry$'
result = re.search(pattern, text)
if result:print("匹配成功:", result.group())
else:print("匹配失败")

3. 匹配包含特定单词的字符串

import retext = "The quick brown fox jumps over the lazy dog"
pattern = r'fox'
result = re.search(pattern, text)
if result:print("匹配成功:", result.group())
else:print("匹配失败")

4. 匹配连续数字

import retext = "abc123def"
pattern = r'\d+'
result = re.findall(pattern, text)
print("匹配结果:", result)

5. 匹配字母和数字的组合

import retext = "abc123def"
pattern = r'[a-zA-Z0-9]+'
result = re.findall(pattern, text)
print("匹配结果:", result)

6. 匹配邮箱地址

import retext = "example@example.com"
pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
result = re.fullmatch(pattern, text)
if result:print("匹配成功:", result.group())
else:print("匹配失败")

7. 匹配手机号码

import retext = "13800138000"
pattern = r'^1[3-9]\d{9}$'
result = re.fullmatch(pattern, text)
if result:print("匹配成功:", result.group())
else:print("匹配失败")

8. 匹配日期格式(YYYY-MM-DD)

import retext = "2025-03-11"
pattern = r'^\d{4}-\d{2}-\d{2}$'
result = re.fullmatch(pattern, text)
if result:print("匹配成功:", result.group())
else:print("匹配失败")

9. 替换所有数字为指定字符

import retext = "abc123def456"
pattern = r'\d+'
replacement = 'X'
result = re.sub(pattern, replacement, text)
print("替换结果:", result)

10. 分割字符串

import retext = "apple,banana,cherry"
pattern = r','
result = re.split(pattern, text)
print("分割结果:", result)

11. 提取 HTML 标签中的内容

import rehtml = '<p>Hello, World!</p>'
pattern = r'<p>(.*?)</p>'
result = re.findall(pattern, html)
print("提取结果:", result)

12. 匹配中文

import retext = "你好,世界!"
pattern = r'[\u4e00-\u9fa5]+'
result = re.findall(pattern, text)
print("匹配结果:", result)

13. 匹配多个单词中的任意一个

import retext = "cat dog elephant"
pattern = r'cat|dog'
result = re.findall(pattern, text)
print("匹配结果:", result)

14. 匹配重复的字符

import retext = "aaaaabbbccc"
pattern = r'(.)\1+'
result = re.findall(pattern, text)
print("匹配结果:", result)

15. 匹配不包含特定字符的字符串

import retext = "abcde"
pattern = r'[^abc]+'
result = re.findall(pattern, text)
print("匹配结果:", result)

16. 匹配单词边界

import retext = "The quick brown fox jumps"
pattern = r'\bfox\b'
result = re.search(pattern, text)
if result:print("匹配成功:", result.group())
else:print("匹配失败")

17. 匹配 IP 地址

import retext = "192.168.1.1"
pattern = r'^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'
result = re.fullmatch(pattern, text)
if result:print("匹配成功:", result.group())
else:print("匹配失败")

18. 匹配 URL

import retext = "https://www.example.com"
pattern = r'^https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+'
result = re.fullmatch(pattern, text)
if result:print("匹配成功:", result.group())
else:print("匹配失败")

19. 统计匹配次数

import retext = "apple apple banana cherry apple"
pattern = r'apple'
matches = re.findall(pattern, text)
count = len(matches)
print("匹配次数:", count)

20. 使用编译后的正则表达式进行匹配

import retext = "abc123def"
pattern = re.compile(r'\d+')
result = pattern.findall(text)
print("匹配结果:", result)

相关文章:

Python 正则表达式模块 re

Python 正则表达式模块 re flyfish 一、正则表达式基础 1. 什么是正则表达式&#xff1f; 正则表达式&#xff08;Regular Expression, RE&#xff09;是一种用于匹配、查找和替换文本模式的工具&#xff0c;由普通字符&#xff08;如字母、数字&#xff09;和特殊字符&…...

[RN 实践有效]Expo+cross-env配置项目环境变量

首先,从中可以看出,cross-env的主要作用是跨平台设置环境变量,而Expo项目通常通过app.config.js或.env文件来管理这些变量。需要强调安装cross-env的必要性,以及如何在package.json中正确配置脚本命令。 接下来,用户的问题是关于Expo中cross-env的详细配置,因此需要分步骤…...

缓存和客户端数据存储体系(Ark Data Kit)--- 应用数据持久化(首选项持久化、K-V、关系型数据库)持续更新中...

Core File Kit做怎删改查操作不便&#xff0c;用Ark Data Kit。 功能介绍 ArkData &#xff08;方舟数据管理&#xff09;为开发者提供数据存储、数据管理和数据同步能力&#xff0c;比如联系人应用数据可以保存到数据库中&#xff0c;提供数据库的安全、可靠以及共享访问等管…...

ES 使用geo point 查询离目标地址最近的数据

需求描述&#xff1a;项目中需要通过经纬度坐标查询目标地所在的行政区。 解决思路大致有种&#xff0c;使用es和mysql分别查询。 1、使用es进行查询 将带有经纬度坐标的省市区数据存入es中&#xff0c;mappings字段使用geo point类型&#xff0c;索引及查询dsl如下。 geo p…...

本地部署OpenManus及原理介绍

概述&#xff1a; 最近Minaus特别火&#xff0c;随后开源社区就有项目尝试复刻Minaus&#xff0c;项目名称为OpenManus&#xff0c;原理是用推理模型为决策者&#xff0c;将我们输入的问题进行分解后调用本地工具执行。 OpenManus安装&#xff1a; 本人在Ubuntu桌面版本上安装…...

高效手机检测:视觉分析技术的优势

在当今社会&#xff0c;手机已成为人们日常生活和工作中不可或缺的工具。然而&#xff0c;在某些特定场合&#xff0c;如考场、工作场所等&#xff0c;手机的使用却可能带来负面影响。因此&#xff0c;如何有效监测和防止在这些场合偷用手机的行为&#xff0c;成为了一个亟待解…...

Java 多线程编程:提升系统并发处理能力!

多线程是 Java 中实现并发任务执行的关键技术&#xff0c;能够显著提升程序在多核处理器上的性能以及处理多任务的能力。本文面向初级到中级开发者&#xff0c;从多线程的基本定义开始&#xff0c;逐步讲解线程创建、状态管理、同步机制、并发工具以及新兴的虚拟线程技术。每部…...

Linux实时内核稳定性案例

稳定性问题分析 RT_RUNTIME_SHARE案例死锁问题Linux-rt下卡死之hrtimer分析Linux内核宕机案例 -mmap空指针Linux Hung Task分析过程...

解决 VSCode SSH 连接报错:“REMOTE HOST IDENTIFICATION HAS CHANGED” 的问题

问题描述 在使用 VSCode 通过 SSH 连接远程服务器时&#xff0c;我们可能会遇到类似如下的错误日志&#xff1a; WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! ... Offending ED25519 key in C:\Users\DELL/…...

Spring Boot配置类原理、Spring Boot核心机制理解,以及实现自动装置的底层原理

目的:从底层源码角度分析 Spring Boot 配置类以及自动装载的底层原理 文章目录 1. Spring Boot 配置类实现自动装载1.1 @Configuration注解1.2 @Configuration 注解完成 bean 注入流程图1.3 @ConfigurationProperties注解赋值2. Spring Boot的核心机制:自动装配2.1 @SpringBo…...

淘宝API vs 爬虫:合规获取实时商品数据的成本与效率对比

以下是淘宝 API 和爬虫在合规获取实时商品数据方面的成本与效率对比&#xff1a; 成本对比 淘宝 API 开发成本&#xff1a;需要申请开发者账号并获取 API 权限&#xff0c;部分敏感或高频访问的接口可能需要额外的审核或付费。开发过程中需要按照平台规定进行编程&#xff0c;相…...

01-Canvas-使用fabric初始

fabric官网&#xff1a; https://fabric5.fabricjs.com/demos/ 创建画布并绘制 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…...

CMake简单入门

简介 CMake 是一个开源的跨平台构建系统生成工具&#xff0c;旨在简化和自动化项目的构建过程。它主要用于管理和控制软件构建的过程&#xff0c;特别是在处理复杂的项目结构和多个平台时。CMake 并不直接进行编译或链接&#xff0c;而是生成本地构建系统所需的文件&#xff0…...

树莓派 连接 PlutoSDR 教程

在树莓派5上安装PlutoSDR&#xff08;ADALM-Pluto&#xff09;的驱动程序&#xff0c;主要需要安装相关的库和工具&#xff0c;以便与PlutoSDR通信&#xff0c;比如libiio和libad9361&#xff0c;并确保系统能够识别设备。由于树莓派5运行的是基于Linux的系统&#xff08;通常是…...

【时时三省】(C语言基础)用printf函数输出数据3

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 ( 5 ) e格式符。 用格式声明%e指定以指数形式输出实数。如果不指定输出数据所占的宽度和数字部分的小数位数&#xff0c;许多C编译系统&#xff08;如VisualC&#xff09;会自动给出数字部分…...

Git使用(二)--如何配置 GitHub 远程仓库及本地 Git 环境

在日常的开发过程中&#xff0c;使用版本控制工具 Git 是一个非常重要的技能&#xff0c;特别是对于管理和协作开发。通过 GitHub&#xff0c;我们可以轻松地进行代码版本管理和共享。这篇博客将带您一步步学习如何配置 Git 环境并将本地仓库与 GitHub 远程仓库连接起来。 一、…...

在Pycharm配置conda虚拟环境的Python解释器

〇、前言 今天在配置python解释器时遇到了这样的问题 经过一下午自行摸索、上网搜寻后&#xff0c;终于找到的解决的方案&#xff0c;遂将该方法简要的记录下来&#xff0c;以备后用&#xff0c;并希望能帮助到有同样问题或需求的朋友:) 我所使用的软件的版本如下&#xff0c;假…...

CURL一文通

文章目录 1.什么是curl2.curl可以发送什么请求3.常见curl发http相关请求怎么写4.curl带上的参数分别有什么&#xff0c;可以怎么用5.进阶用法6.常见错误以及学习指导建议 1.什么是curl 是利用URL语法在命令行下工作的开源文件传输工具。尤其被广泛应用的在linux系统下。 2.cu…...

零基础keil:设置注释快捷键

1.打开快捷键设置&#xff1a; 在Keil中&#xff0c;选择菜单栏中的“Settings”&#xff0c;然后选择“Shortcuts”来打开快捷键设置界面。 2.选择注释命令&#xff1a; 在快捷键设置界面中&#xff0c;找到与注释相关的命令&#xff0c;如“Comment Selection”&#xff0…...

Java中关于Optional的 orElse 操作,以及 orElse 与 orElseGet 的区别

文章目录 1. 大概说明2. 详细分析2.1 .orElse 操作2.2 .orElse 的作用&#xff1a;避免空指针异常2.3 为什么要用&#xff1f;2.4 orElseGet如何使用2.5 orElse和orElseGet的区别 1. 大概说明 这篇文章的目的是为了说明&#xff1a; orElse 如何使用orElseGet 如何使用两者的…...

TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)

TCP/IP协议中三次握手&#xff08;Three-way Handshake&#xff09;与四次挥手&#xff08;Four-way Wave&#xff09; 一、TCP三次握手&#xff08;Three-way Handshake&#xff09;二、TCP四次挥手&#xff08;Four-way Wave&#xff09;三、常见问题解答总结为什么三次握手不…...

python学智能算法(八)|决策树

【1】引言 前序学习进程中&#xff0c;已经对KNN邻近算法有了探索&#xff0c;相关文章链接为&#xff1a; python学智能算法&#xff08;七&#xff09;|KNN邻近算法-CSDN博客 但KNN邻近算法有一个特点是&#xff1a;它在分类的时候&#xff0c;不能知晓每个类别内事物的具…...

【经验】Orin系列Ubuntu远程桌面:VNC、NoMachine、URDC

1、VNC 1.1 Ubuntu端 1)安装VNC服务器 sudo apt install tigervnc-standalone-server2)安装xfce4 桌面 xfce4 用资源较GNOME ,KDE较少。适合老机器,轻量级桌面。与windows界面环境类似。 sudo apt install xfce4 xfce4-goodies也可以使用其它的桌面系统,可以使用如下命…...

【QT:控件】

目录 控件状态&#xff1a;​编辑 geometry : window frame windowlcon: qrc机制 qrc的使用方式&#xff1a; window opacity cursor font: ToolTip focusPolicy: styleSheet: 按钮类控件&#xff1a; PushButton: 给按钮添加图标&#xff1a; 给按钮添加快捷键…...

Python(最新版)集成开发环境PyCharm下载安装详细教程

Python 下载和安装 1.进入Python官网 Download Python | Python.org&#xff0c;点击Downloads&#xff0c;这里以Windows为例 2.选择下载Python 3.13.2 Windows 64位的版本。注意&#xff1a;不能在Windows 7 或更早的版本上使用。 3.打开文件&#xff0c;会自动出现安装界…...

PyTorch 实现 Conditional DCGAN(条件深度卷积生成对抗网络)进行图像到图像转换的示例代码

以下是一个使用 PyTorch 实现 Conditional DCGAN&#xff08;条件深度卷积生成对抗网络&#xff09;进行图像到图像转换的示例代码。该代码包含训练和可视化部分&#xff0c;假设输入为图片和 4 个工艺参数&#xff0c;根据这些输入生成相应的图片。 1. 导入必要的库 import …...

【BERT和GPT的区别】

BERT采用完形填空&#xff08;Masked Language Modeling, MLM&#xff09;与GPT采用自回归生成&#xff08;Autoregressive Generation&#xff09;的差异&#xff0c;本质源于两者对语言建模的不同哲学导向与技术目标的根本分歧。这种选择不仅塑造了模型的架构特性&#xff0c…...

PTA 7-12 排序

题目描述 给定 n 个&#xff08;长整型范围内的&#xff09;整数&#xff0c;要求输出从小到大排序后的结果。 本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下&#xff1a; 数据1&#xff1a;只有1个元素&#xff1b;数据2&#xff1a;11个不…...

uniapp 实现的步进指示器组件

采用 uniapp 实现的一款步进指示器组件&#xff0c;展示业务步骤进度等内容&#xff0c;对外提供“前进”、“后退”方法&#xff0c;让用户可高度自定义所需交互&#xff0c;适配 web、H5、微信小程序&#xff08;其他平台小程序未测试过&#xff0c;可自行尝试&#xff09; 可…...

大模型-提示词调优

什么是提示词 提示词&#xff08;Prompt&#xff09;在大模型应用中扮演着关键角色&#xff0c;它是用户输入给模型的一段文本指令 。简单来说&#xff0c;就是我们向大模型提出问题、请求或描述任务时所使用的文字内容。例如&#xff0c;当我们想让模型写一篇关于春天的散文&a…...