re.compile为什么能提高速度?

news/2025/11/17 22:34:30/文章来源:https://www.cnblogs.com/wangya216/p/19234689

re.compile(pattern, flags=0)  的核心作用是 “编译正则表达式模式,生成可重复使用的 Pattern 对象”——本质是把正则字符串“编译”成正则引擎可直接执行的“字节码”,核心价值是 提升重复使用时的效率 + 简化代码。

一、核心用途(用例子说清楚)

  1. 提升重复使用的效率(最关键)

正则表达式的执行分两步:① 解析正则字符串(语法分析、生成匹配规则);② 用规则匹配文本。
 re.compile  会提前完成步骤①,后续重复匹配时直接跳过解析步骤,只执行步骤②,尤其适合多次使用同一正则的场景(如批量验证、循环匹配)。

对比示例:批量验证1000个手机号

python

import re
import time

场景:验证1000个手机号,同一正则重复使用

phones = ["13812345678"] * 1000

方法1:不使用 compile(每次匹配都解析正则)

start = time.time()
for phone in phones:
re.match(r"^1[3-9]\d{9}$", phone)
print("不compile耗时:", time.time() - start) # 约 0.002~0.003 秒

方法2:使用 compile(仅解析1次,重复使用)

start = time.time()
phone_pattern = re.compile(r"^1[3-9]\d{9}$")
for phone in phones:
phone_pattern.match(phone)
print("compile后耗时:", time.time() - start) # 约 0.001~0.002 秒

  • 结论:重复次数越多, compile  的效率优势越明显(数据量越大,差距越大)。
  1. 简化代码,提高可读性

如果同一正则需要在多个地方使用, compile  能避免重复写正则字符串,还能给 Pattern 对象起有意义的名字,代码更简洁。

示例:

python

import re

编译正则(一次定义,多处使用)

email_pattern = re.compile(r"[1]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$")
phone_pattern = re.compile(r"^1[3-9]\d{9}$")

验证用户输入

user_inputs = {"email": "test@163.com", "phone": "13812345678"}

直接调用 Pattern 对象的方法(match/search/findall 等)

if email_pattern.match(user_inputs["email"]):
print("邮箱格式正确")
if phone_pattern.match(user_inputs["phone"]):
print("手机号格式正确")

  • 对比:如果不  compile ,每次验证都要写完整正则,既冗余又容易出错。
  1. 统一管理正则规则

复杂项目中,可将所有编译后的 Pattern 对象集中存放(如配置文件、工具类),便于维护和修改。

示例:

python

工具类:集中管理编译后的正则

import re

class RegexUtils:
# 编译正则(仅初始化时执行1次)
EMAIL = re.compile(r"[2]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$")
PHONE = re.compile(r"^1[3-9]\d{9}$")
ID_CARD = re.compile(r"[3]\d{5}(19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$")

调用时直接使用,无需重复编译

if RegexUtils.EMAIL.match("demo@qq.com"):
print("邮箱有效")

二、Pattern 对象的常用方法(和 re 模块函数对应)

编译后生成的 Pattern 对象,支持  re  模块的核心方法,用法完全一致:

Pattern 对象方法 对应 re 模块函数 功能
 pattern.match(string)   re.match(pattern, string)  从字符串开头匹配
 pattern.search(string)   re.search(pattern, string)  整个字符串查找第一个匹配
 pattern.findall(string)   re.findall(pattern, string)  查找所有匹配项
 pattern.sub(repl, string)   re.sub(pattern, repl, string)  替换匹配内容
 pattern.split(string)   re.split(pattern, string)  按匹配内容分割

三、什么时候不需要用 compile?

  • 正则仅使用1次:直接用  re.match/re.search  等函数,无需编译(多此一举);
  • 正则字符串动态生成:每次匹配的正则都不同(如根据用户输入拼接正则),无法提前编译。

总结

re.compile  的核心价值是 “预编译+复用”:

  • 效率层面:避免重复解析正则,提升重复匹配的性能;
  • 代码层面:简化重复代码,提高可读性和维护性;
  • 适用场景:正则需要多次使用、项目中多处用到同一正则、复杂正则需要统一管理。

记住:多次使用的正则,优先 compile;仅用1次的正则,直接调用 re 模块函数即可。


  1. a-zA-Z0-9_.- ↩︎

  2. a-zA-Z0-9_.- ↩︎

  3. 1-9 ↩︎

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

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

相关文章

从 0 搭建 LLM 不再难!这个 PyTorch 项目帮你吃透大模型底层逻辑

如果你曾想深入理解大语言模型(LLM)的 “五脏六腑”,却被框架封装的黑盒接口、复杂的源码结构劝退;如果你希望亲手实现 Transformer 的每一个组件,而非单纯调用transformers库 —— 那么今天推荐的这个开源项目,…

题解:P8819 [CSP-S 2022] 星战

CSP-S 2022 T3 和哈希 trick你说的对,但是, “不可以,总司令!” 这是一个神秘 trick,它的模板题是 P3560,可以先把这个题写了或者先把星战写了再写模板。 题意简述 题目链接 给出 \(n\) 个点 \(m\) 条边的有向图…

instr在mysql索引中作用是什么

在MySQL中,instr函数并不是直接用于创建或管理索引的。然而,instr函数可以用于查询字符串中的子串位置,这在某些情况下可能与索引的使用相关。instr函数用于返回子字符串在字符串中第一次出现的位置。如果子字符串不…

initrans参数在oracle高并发环境下的作用

initrans 参数在 Oracle 数据库中用于设置数据库实例启动时的事务处理并发控制器的初始数量。这个参数对于高并发环境下的数据库性能至关重要,因为它直接影响到数据库能够同时处理的事务数量。在高并发环境下,多个用…

Java集合之【CopyOnWrite和Collections.synchronizedList()的区别】

CopyOnWriteArrayList 介绍 什么是 CopyOnWriteArrayList 适合读多写少的场景 是一个线程安全的List实现,特点是写时复制 当CopyOnWriteArrayList进行修改操作(如add,set,remove)的时候,会复制原数组的值到创建的新…

20232324 2024-2025-1 《网络与系统攻防技术》实验六实验报告

20232324 2024-2025-1 《网络与系统攻防技术》实验六实验报告1.实验内容 1.1靶机探测:主机、端口及漏洞扫描 通过Metasploit的Aux模块中arp_sweep工具完成主机发现;端口扫描可选用nmap工具,或Metasploit的Aux模块中…

Python调用C++代码

Python调用C++代码 1. extern "C" {} 包裹导出函数 // C++ 中存在名称修饰,通过 extern "C" {} 将C++函数导出为C函数 // 1. 为类的每个函数创建C风格接口,第一个参数为对象指针 // 2. 提供 cre…

复杂状态与数据流管理:分布式定时任务系统的设计

好的,这是一个非常考验系统设计深度的问题。下面我将详细拆解这个“分布式定时任务系统”的设计,重点阐述如何解决可靠性和幂等性这两个核心挑战。复杂状态与数据流管理:分布式定时任务系统的设计 在GM平台中,定时…

【第6章 字符串】Python 字符串常用操作完全教程(含代码演示)

{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Python 字符串常用操作完全教程(含代码演示)\n", "> 基于《Pytho…

DAG-有向无环图-拓扑排序

1. 场景 通过当前节点与依赖节点列表描述一个有向无环图DAG节点依赖问题,适合流程图中节点依赖关系的定义,适合存在明确的依赖关系并且按依赖顺序执行的领域项目管理与任务调度 工作流与审批流程2. 数据描叙name:描…

MySQL EXPLAIN中的key_len:精准掌握索引使用情况

深入解析MySQL执行计划中最关键的指标之一,助你快速定位索引优化点,提升查询性能!同时介绍了key_len计算的核心规则。MySQL系列文章 深入解析MySQL执行计划中最关键的指标之一,助你快速定位索引优化点,提升查询性…

1090 : 分解因数 25-11-17

|DFS|递归| 本题的dfs特点在于搜索的空间是动态的,因此需要找到可以利用到限制下一步递归的条件来进行空 间范围的缩小与框定。本题利用的是分解的最小因数,可以对下一步的遍历框定范围 #include<iostream> #i…

NOIP 模拟赛 9

NOIP 模拟赛总结 NOIP 模拟赛 9调了一整场的 T2,样例全过!只有 40 pts。QxQT1 卡门连续两场 T1 放数据结构了欸数据结构题,直接分块就行。 赛时没算时间复杂度,导致打了个暴力交上去以为是正解。 赛后半小时改完,…

Sora 2 Cameo多角色上传+Remix二创功能API接入教程,史低0.08/条

​ 你还记得Sora2推出的Cameo和Remix功能吗? Cameo(客串)是 Sora 2 推出的官方真人出镜功能,允许用户通过录制验证视频,将自己的面部、体型、声音特征提取并融合到 AI 生成的任意场景中,实现"真人演员+虚拟场景…

info linux

当然可以!你提到的 + #引号 + info linux + #引号 + 是一个在 Linux 系统中常用的命令,用于查看 Linux 内核的文档。它属于 info 命令集,是 man 命令的替代品,主要用于查看系统级的文档。 一、info 命令简介…

AWS云服务深度集成

第一部分:素材管理系统 - 分片上传与断点续传架构 在海量素材上传场景下,网络不稳定、文件巨大(数GB的视频/设计稿)是常态。直接简单上传会导致频繁失败且难以恢复。我们基于 AWS S3 Pre-signed URLs 和 Multipart…

httpd linux 启动

在 Linux 系统中,httpd 通常指的是 Apache HTTP Server,它是一个常用的 Web 服务器软件。如果你想要启动 Apache HTTP Server,可以使用以下几种常见方法:方法一:使用 systemd(适用于大多数现代 Linux 发行版) s…

浅谈 Manacher

问题引入 给定一个长度为 \(n\) 的字符串 \(s\),保证 \(s\) 只由小写字母组成,要求计算出 \(s\) 中最长的连续回文子串的长度。 乍一看,诶我会 \(O(n^3)\) 做法!枚举左右端点然后暴力判断就行。 但是这也太慢了吧!…

第28天(简单题中等题 二分查找)

打卡第二十八天 1道简单题+2道中等题题目:思路:双指针+二分查找 代码: class Solution { public:vector<int> kthSmallestPrimeFraction(vector<int>& arr, int k) {const int n = (int)arr.size();//…

基于MIMO系统的SCMA稀疏码多址接入和MPA消息传递算法matlab仿真

1.算法运行效果图预览2.算法运行软件版本 matlab2022a/matlab2024b 3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)................................................................r = de2bi(X, l…