【Python 正则表达式】

news2025/5/16 16:10:50

Python 正则表达式通过 re 模块实现模式匹配,是文本处理的核心工具。以下是系统化指南,包含语法详解和实战案例:


一、正则基础语法

1. 元字符速查表
符号含义示例匹配结果
.任意字符(除换行符)r"a.c"“abc”, “a\nc” ❌
^行首锚定r"^Python"“Python…”
$行尾锚定r"\.py$"“file.py”
\d数字r"\d{3}-\d{4}"“010-1234”
\D非数字r"\D+@example.com"“user@example.com”
\w单词字符(字母/数字/_)r"\w+@\w+\.\w+"“alice@test.com”
\s空白字符r"hello\s+world"“hello world”
*0次或多次r"ab*c"“ac”, “abc”, “abbc”
+1次或多次r"ab+c"“abc”, “abbc”
?0次或1次r"https?://"“http://”, “https://”
{}精确次数/范围r"\d{3,5}"“123”, “45678”
2. 特殊构造
# 分组与捕获
match = re.search(r"(\d{3})-(\d{4})", "010-1234")
print(match.group(1))  # "010"(第一个分组)
print(match.groups())   # ("010", "1234")

# 非捕获分组
re.search(r"(?:\d{3}-){2}\d{4}", "010-1234-5678")  # 不捕获中间分组

# 命名分组
re.search(r"(?P<area>\d{3})-(?P<num>\d{4})", "010-1234").groupdict()  # {'area': '010', 'num': '1234'}

二、核心函数详解

1. 匹配与搜索
import re

# 全文匹配
re.fullmatch(r"\d{3}-\d{4}", "010-1234")  # 必须完全匹配

# 搜索首个匹配
re.search(r"\b\w+@\w+\.\w+\b", "Contact: alice@test.com").group()  # "alice@test.com"

# 搜索所有匹配
re.findall(r"\d+", "订单123,金额456元")  # ['123', '456']
2. 替换操作
# 简单替换
re.sub(r"\bPython\b", "Java", "Python is great. Pythonic code.")  # "Java is great. Pythonic code."

# 函数替换(动态计算)
def hex_replace(match):
    return hex(int(match.group()))

re.sub(r"\d+", hex_replace, "RGB(255,0,128)")  # "RGB(0xff,0x0,0x80)"
3. 分割字符串
re.split(r"[,;\s]+", "apple, banana; cherry  date")  # ['apple', 'banana', 'cherry', 'date']

三、高级模式技巧

1. 贪婪与非贪婪匹配
re.findall(r"<(.*)>", "<a>text</a><b>more</b>")  # 贪婪模式:['a>text</a><b>more']
re.findall(r"<(.*?)>", "<a>text</a><b>more</b>") # 非贪婪:['a', 'b']
2. 边界控制
# 单词边界
re.findall(r"\bcat\b", "The cat sat on the mat.")  # ['cat']

# 多行模式
re.findall(r"^Python", "Java\nPython\nC++", re.MULTILINE)  # ['Python']
3. 前瞻断言
# 肯定顺序环视
re.findall(r"\b\w+(?=ing\b)", "Reading writing coding")  # ['Read', 'writ', 'cod']

# 否定顺序环视
re.findall(r"\b\w+(?!ing\b)", "Play played playing")      # ['Play', 'played']

四、实战案例库

1. 数据验证
# 邮箱验证
EMAIL_REGEX = r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"
re.fullmatch(EMAIL_REGEX, "user@example.com")  # 有效

# URL验证
URL_REGEX = r"https?://(?:www\.)?[^\s/$.?#].[^\s]*"
re.fullmatch(URL_REGEX, "https://www.test.com/path?query=1")  # 有效
2. 文本提取
# 提取HTML标签内容
html = "<div class='content'>Hello</div><p>World</p>"
re.findall(r"<([a-z]+)>(.*?)</\1>", html, re.DOTALL)  # [('div', 'Hello'), ('p', 'World')]

# 解析日志时间戳
log = "2025-05-11 14:30:00 [ERROR] Connection failed"
re.search(r"\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}", log).group()  # "2025-05-11 14:30:00"
3. 数据清洗
# 去除多余空格
"Hello   World  ".strip()  # 简单方法
re.sub(r"\s+", " ", text).strip()  # 正则更彻底

# 隐藏敏感信息
phone = "138-1234-5678"
re.sub(r"(\d{3})\d{4}(\d{4})", r"\1****\2", phone)  # "138****5678"

五、性能优化策略

1. 预编译正则对象
# 编译模式(高频使用时提升30%+性能)
email_pattern = re.compile(EMAIL_REGEX)
email_pattern.fullmatch("user@test.com")  # 比直接使用re.fullmatch快
2. 避免回溯失控
# 危险模式(可能导致指数级回溯)
re.search(r"^(a+)+$", "a" * 20 + "b")  # 极端情况会卡死

# 安全模式(使用原子组)
re.search(r"^(?>(a+)+)b$", "aaaaab")  # 快速失败
3. 匹配引擎选择
  • re.search() vs re.match():后者强制从字符串开头匹配
  • re.finditer():返回迭代器节省内存(处理大文本时)

六、调试工具推荐

  1. 在线测试

    • Regex101(实时可视化匹配过程)
    • RegExr(内置常用正则库)
  2. Python 调试

    # 打印调试信息
    pattern = re.compile(r"(\d+)-(\w+)")
    print(pattern.pattern)      # 输出正则表达式
    print(pattern.flags)        # 显示修饰符标志
    print(pattern.groups)       # 显示分组数量
    

七、常见陷阱避坑指南

  1. 特殊字符转义

    # 错误:直接使用括号
    re.search(r"(123)", "test(123)test")  # 无法匹配
    # 正确:转义元字符
    re.search(r"\(123\)", "test(123)test")
    
  2. 编码问题

    # 处理非ASCII字符时指定UNICODE标志
    re.search(r"^\w+$", "中文", re.UNICODE)  # Python3默认开启
    
  3. 贪婪匹配陷阱

    # 错误:贪婪匹配导致跨标签捕获
    re.findall(r"<(.*)>", "<a>1</a><b>2</b>")  # ['a>1</a><b>2']
    # 正确:使用非贪婪模式
    re.findall(r"<(.*?)>", ...)  # ['a', '/a', 'b', '/b']
    

掌握这些技巧后,可处理90%以上的正则需求。对于复杂场景(如多语言混合文本),建议结合regex第三方库(支持Unicode属性、模糊匹配等高级功能)。

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

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

相关文章

ubuntu服务器版启动卡在start job is running for wait for...to be Configured

目录 前言 一、原因分析 二、解决方法 总结 前言 当 Ubuntu 服务器启动时&#xff0c;系统会显示类似 “start job is running for wait for Network to be Configured” 或 “start job is running for wait for Plymouth Boot Screen Service” 等提示信息&#xff0c;并且…

QT6 源(101)阅读与注释 QPlainTextEdit,其继承于QAbstractScrollArea,属性学习与测试

&#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09;属性学习与测试 &#xff1a; &#xff08;4&#xff09; &#xff08;5&#xff09; 谢谢

Coze 实战教程 | 10 分钟打造你的AI 助手

> 文章中的 xxx 自行替换&#xff0c;文章被屏蔽了。 &#x1f4f1; 想让你的xxx具备 AI 对话能力&#xff1f;本篇将手把手教你&#xff0c;如何用 Coze 平台快速构建一个能与用户自然交流、自动回复提问的 xxx助手&#xff0c;零代码、超高效&#xff01; &#x1f4cc;…

牛客网 NC22167: 多组数据a+b

牛客网 NC22167: 多组数据ab 题目分析 这道题目来自牛客网&#xff08;题号&#xff1a;NC22167&#xff09;&#xff0c;要求我们计算两个整数a和b的和。乍看简单&#xff0c;但有以下特殊点需要注意&#xff1a; 输入包含多组测试数据每组输入两个整数当两个整数都为0时表示…

K8S Ingress、IngressController 快速开始

假设有如下三个节点的 K8S 集群&#xff1a; ​ k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、理论介绍 1&#xff09;什么是 Ingress 定义&#xff1a;Ingress 是 Kubernetes 中的一种资源对象&#xff0c;它定义了外部访问集群内…

快消零售AI转型:R²AIN SUITE如何破解效率困局

引言 快消零售行业正经历从“规模扩张”到“精益运营”的转型阵痛&#xff0c;消费者需求迭代加速、供应链复杂度攀升、人力成本持续走高&#xff0c;倒逼企业通过技术升级实现业务重塑[1]。RAIN SUITE以AI应用中台为核心&#xff0c;针对快消零售场景打造全链路提效方案&…

电路中零极点的含义

模拟电路中的零极点设计非常重要&#xff0c;涉及到系统的稳定。零点是开环传输函数分子为0时对应的频率。极点就是开环传递函数分子为0时对应的频率。 零点表征电路中能量输出路径的抵消效应&#xff0c;当不同支路的信号大小相等、方向相反时&#xff0c;导致特定频率下响应…

解读RTOS 第八篇 · 内核源码解读:以 FreeRTOS 为例

1. 引言 FreeRTOS 作为最流行的嵌入式实时操作系统之一,其内核源码简洁且功能完善。通过剖析其关键模块(任务管理、调度器、队列、内存管理和移植层),不仅能够更深入地理解 RTOS 的运行机制,还能掌握根据项目需求进行内核定制与优化的能力。本章将带你以 FreeRTOS 10.x 版…

2025年长三角+山东省赛+ 认证杯二阶段资料助攻说明

长三角高校数模B题 完整论文代码已经在售后群 网盘链接 发布 长三角更新时间轴 5.15 23:00 B站发布 完整论文讲解视频 5.16 18:00 j降重说明 5.17 22:00 无水印版本可视化无水印代码 其余时间 写手老师 售后群在线答疑 山东省助攻C道 认证杯二阶段助攻C题 山东省认证杯…

鸿蒙电脑:五年铸剑开新篇,国产操作系统新引擎

出品 | 何玺 排版 | 叶媛 前不久&#xff0c;玺哥发布的《鸿蒙电脑&#xff0c;刺向垄断的利刃&#xff0c;将重塑全球PC市场格局》发布后&#xff0c;获得了读者朋友的积极反馈&#xff0c;不少都期望鸿蒙电脑早日发布。 如今&#xff0c;它真来了&#xff01; 5月8日&…

SQLMesh信号机制详解:如何精准控制模型评估时机

SQLMesh的信号机制为数据工程师提供了更精细的模型评估控制能力。本文深入解析信号机制的工作原理&#xff0c;通过简单和高级示例展示如何自定义信号&#xff0c;并提供实用的使用技巧和测试方法&#xff0c;帮助读者优化数据管道的调度效率。 一、为什么需要信号机制&#xf…

通义千问-langchain使用构建(二)

目录 序言xinference应用构建构建过程简单概述成效 chatchat应用构建过程成效 总结 序言 在昨天的使用langchain的基础上。又尝试了构建智能问答应用。 使用langchain chatchat这个开源包&#xff0c;构建了一下智能问答系统。 前置项&#xff0c;是使用了一下xinference框架&…

[IMX] 02.GPIO 寄存器

目录 手册对应章节 1.GPIO 复用&#xff08;引脚功能选择&#xff09;- IOMUXC_SW_MUX_CTL_PAD_xxx 2.GPIO 电气特性 - IOMUXC_SW_PAD_CTL_PAD_xxx 3.GPIO 数据与控制寄存器 3.1.数据 - DR 3.2.输入/输出选择 - GDIR 3.3.状态 - PSR 3.4.中断触发控制 - ICR 3.5.中断使…

【电子通识】热敏纸的静态发色性能和动态发色性能测试方法

静态发色性能的测定 测定治具 测定静态发色曲线需要使用三个仪器,包括静态发色仪、秒表(分辨力为0.01 s)、反射光密度计(符合 GB/T23649)。 静态发色曲线使用的测试仪为静态发色仪。其结构如下图所示:包括了保湿压板、金属加热板、温度显示器、控制面板。温度能在50℃到…

AIbase推出全球MCP Server集合平台 收录超12万个MCP服务器客户端

2025年&#xff0c;AI领域迎来了一项重要的技术进展——MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;的广泛应用。全球MCP Server集合平台AIbase(https://mcp.aibase.cn/)应运而生&#xff0c;为AI开发者提供了一站式的MCP服务器和客户端整合…

使用CMake中的configure_file命令自动生成项目版本信息

1 背景 随着实际项目的完善&#xff0c;可维护变的更加重要。在日志中保存项目的版本或是构建信息是一个非常有用的方法。 CMake提供了configure_file()命令&#xff0c;可以帮助开发者在构建项目时&#xff0c;自动生成版本或是构建信息&#xff0c;便于开发者在代码中直接引…

Linux的进程管理和用户管理

gcc与g的区别 比如有两个文件&#xff1a;main.c mainc.cpp&#xff08;分别是用C语言和C语言写的&#xff09;如果要用gcc编译&#xff1a; gcc -o mainc main.c gcc -o mainc mainc.cpp -lstdc表明使用C标准库&#xff1b; 区别一&#xff1a; gcc默认只链接C库&#x…

【springcloud学习(dalston.sr1)】Eureka服务端集群的搭建(含源代码)(二)

该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍&#xff08;含源代码&#xff09;&#xff08;一&#xff09; 这篇文章主要介绍多个eureka服务端的集群环境是如何搭建的。 &#xff08;一&#xff09;eureka的简要说明 Eu…

崩坏星穹铁道 3.3 版本前瞻活动攻略:在黎明升起时坠落

《崩坏星穹铁道》3.3 版本 “在黎明升起时坠落” 将于 5 月 21 日正式上线。本次版本更新内容丰富&#xff0c;新角色、新地图、新活动和新周本 BOSS 等精彩内容&#xff0c;等待开拓者们前去体验。下面就为大家带来 3.3 版本的前瞻活动攻略。 一、新角色与卡池 1.上半卡池&am…

OneNote内容太多插入标记卡死的解决办法

OneNote内容太多插入标记卡死的解决办法 针对平板电脑的OneNote用户适合此类情况&#xff1a; 当向电脑导入几百页pdf可以正常使用&#xff0c;唯独插入标记的时候OneNote直接罢工&#xff0c;只能关闭。关闭时还可能会出现0x000000fxxxxx的错误。 注&#xff1a;仅对于平板…