在 Python 中编译正则表达式

2023-12-29

我正在阅读 Doug Hellman 的“Python 标准库示例”,并发现了这一点:

》1.3.2 编译表达式 re 包含用于将正则表达式作为文本字符串处理的模块级函数,但更有效的是compile程序经常使用的表达式。”

我无法理解他对为什么会出现这种情况的解释。他说,“模块级函数维护编译表达式的缓存”,并且由于“缓存的大小”是有限的,“直接使用编译表达式可以避免缓存查找开销。”

如果有人可以解释或指导我更好地理解为什么编译程序经常使用的正则表达式更有效,以及这个过程实际上是如何工作的,我将不胜感激。


嗯。这很奇怪。到目前为止我的知识(除其他来源外,获得的知识,从这个问题 https://stackoverflow.com/questions/452104/is-it-worth-using-pythons-re-compile)建议我最初的答案:


第一个答案

Python 会缓存您最近使用的 100 个正则表达式,因此即使您没有显式编译它们,也不必在每次使用时重新编译它们。

但是,有两个缺点:当达到 100 个正则表达式的限制时,整个缓存都会被破坏,因此如果连续使用 101 个不同的正则表达式,则每次都会重新编译每个正则表达式。嗯,这不太可能,但仍然如此。

其次,为了查明正则表达式是否已编译,解释器每次都需要在缓存中查找正则表达式,这确实需要一点额外的时间(但不会太多,因为字典查找非常快)。

因此,如果您显式编译正则表达式,则可以避免这个额外的查找步骤。


Update

我刚刚做了一些测试(Python 3.3):

>>> import timeit
>>> timeit.timeit(setup="import re", stmt='''r=re.compile(r"\w+")\nfor i in range(10):\n r.search("  jkdhf  ")''')
18.547793477671938
>>> timeit.timeit(setup="import re", stmt='''for i in range(10):\n re.search(r"\w+","  jkdhf  ")''')
106.47892003890324

所以看起来没有进行缓存。也许这是特殊条件下的一个怪癖timeit.timeit() runs?

另一方面,在 Python 2.7 中,差异并不那么明显:

>>> import timeit
>>> timeit.timeit(setup="import re", stmt='''r=re.compile(r"\w+")\nfor i in range(10):\n r.search("  jkdhf  ")''')
7.248294908492429
>>> timeit.timeit(setup="import re", stmt='''for i in range(10):\n re.search(r"\w+","  jkdhf  ")''')
18.26713670282241
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中编译正则表达式 的相关文章

  • Pyjnius导入jar文件

    Pyjnius 允许您为 java 类创建 python 包装器 例如 Hardware autoclass org myapp Hardware 有没有办法像这样导入现有的 jar 文件 语法是什么样的 您可以将 jar 添加到 CLAS
  • Python绕相机轴旋转图像

    假设我有一个图像 是在对某些原始图像应用单应性变换 H 后获得的 未显示原始图像 将单应性 H 应用于原始图像的结果是该图像 我想围绕合适的轴 可能是相机所在的位置 如果有的话 将此图像旋转 30 度以获得此图像 如果我不知道相机参数 如何
  • 如何逐行替换(更新)文件中的文本

    我试图通过读取每一行 测试它 然后写入是否需要更新来替换文本文件中的文本 我不想保存为新文件 因为我的脚本已经先备份文件并对备份进行操作 这是我到目前为止所拥有的 我从 os walk 获取路径 并且保证 pathmatch var 正确返
  • Pandas cut 方法不包括下限

    我正在尝试对包含 0 到 100 范围内的年龄的数据帧列进行分箱 当我尝试使用垃圾箱来包含零年龄时 它不起作用 这是一个使用包含我的数据范围的列表的演示 pd cut pd Series range 101 0 24 49 74 100 范
  • Python/Scipy 2D 插值(非均匀数据)

    这是我上一篇文章的后续问题 Python Scipy 插值 地图坐标 https stackoverflow com questions 5124126 python scipy interpolation map coordinates
  • 如果工作表不存在,Pandas 将工作表附加到工作簿,否则覆盖工作表

    我正在使用 pandas 更新现有的 Excel 工作簿 当使用ExcelWriter对象 我可以覆盖工作表 如果存在 否则创建一个新工作表吗 我的代码附加了新工作表 但是当我尝试覆盖现有工作表时 它会附加一个名称略有不同的新工作表 例如
  • 使用 mechanize 和 beautiful soup 在 python 中进行原始 HTML 与 DOM 抓取

    我正在尝试编写一个程序 作为示例 该程序将从该网页上刮掉最高价格 http www kayak com flights JFK PAR 2012 06 01 2012 07 01 1adults http www kayak com fli
  • Python textwrap.wrap 导致 \n 问题

    所以我只是重新格式化了一堆代码以合并textwrap wrap 却发现我所有的 n都消失了 这是一个例子 from textwrap import wrap def wrapAndPrint msg width 25 wrap msg to
  • Odoo:如何覆盖原始功能

    在 Odoo 中 每次打开产品表单时都会计算产品的数量 这发生在模型中product product gt function product available 该函数返回一个名为 res 的字典 Example res 8 qty ava
  • Python 日志记录 - 如何检查记录器是否为空

    我刚刚在我的应用程序中实现了日志记录 我想知道是否有一种方法可以检查记录器是否为空 我的想法是在我的脚本中设置两个处理程序 一个用于带水平仪的控制台WARNING 一个用于带级别的文件DEBUG 在脚本的最后 我需要检查是否CONSOLE记
  • 在Python中从整个图像中检测表格部分

    我有一张尺寸为 3500x5000 的图像 现在我只想检测整个图像中的表格部分 如果不能直接进行 OCR 处理 则对其进行裁剪和旋转 经过所有搜索后 我想到了使用裁剪图像中的每个单元格的想法https medium com coinmonk
  • 在 CSV 文件的最上面一行写入

    我有这个sample csv 文件 a 1 apple b 2 banana c 3 cranberry d 4 durian e 5 eggplant 并有以下代码 samplefile open sample csv rb rows s
  • 如何使 cx-oracle 将查询结果绑定到字典而不是元组?

    这是我的代码 我想找到一种方法将查询结果作为字典列表而不是元组列表返回 看起来 cx oracle 通过部分文档讨论 绑定 来支持这一点 虽然我不知道它是如何工作的 def connect dsn cx Oracle makedsn hos
  • 无法从源 pylance 解析导入烧瓶

    我正在学习 Python 课程的一部分是使用 Flask 设置网络服务器 我按照 Flask 安装文档执行了步骤 由于某种原因 flask 模块带有下划线 如下所示 当我将鼠标悬停时 我会得到如下附加信息 无法从源 pylance 解析导入
  • 类型错误:不可散列的类型:pandas 的“切片”

    我有一个 pandas 数据结构 我这样创建 test inputs pd read csv input test csv delimiter 它的形状 print test inputs shape is this 28000 784 我
  • RegEx 使用 match() 在 JavaScript 中提取字符串数组

    我正在尝试使用string match 在 javascript 中使用正则表达式来提取字符串数组 这是一个示例字符串 CREATE TABLE listings listing id INTEGER UNIQUE state TEXT t
  • 如何在Python中仅列出顶级目录?

    我希望能够仅列出某个文件夹内的目录 这意味着我不需要列出文件名 也不需要其他子文件夹 让我们看看一个例子是否有帮助 在当前目录中我们有 gt gt gt os listdir os getcwd cx Oracle doc DLLs Doc
  • 如何匹配撇号('),除非它被转义(\')?

    是否可以为此构造一个正则表达式 如果是这样 如果有人展示如何操作 我将不胜感激 使用这个正则表达式
  • 从 Python 访问 802.11 无线管理帧

    我想从 Linux 上的 Python 嗅探 802 11 管理 探测请求 帧 这可以从 Scapy 中实现 如下所示 coding utf 8 from scapy all import def proc p if p haslayer
  • 根据键的重复值从列表中删除字典

    我是Python新手 假设我有以下字典列表 mydictList a 1 b 2 c 3 a 2 b 2 c 4 a 2 b 3 c 4 从上面的列表中 我想删除具有相同键 b 值的字典 所以结果列表应该是 mydictList a 1 b

随机推荐

  • 使用 Node.js 设置 SSL

    我在 GoDaddy 购买了 SSL 证书 并使用以下 node js 服务器尝试设置它 var https require https module for https fs require fs required to read cer
  • 使用 Oracle 客户端 64 位和 Visual Studio 2010 时出现 BadImageFormatException!

    我们的一名开发团队成员遇到了错误 尝试加载 Oracle 客户端库抛出 BadImageFormatException 它似乎 当在 64 位模式下运行并安装了 32 位 Oracle 客户端组件时 会出现此问题 但配置系统的是我 以下是规
  • 点击事件被列表视图父项捕获

    我正在编写一个在 Firemonkey 中使用的自定义开关对象TListView每个项目的控制 除了一个奇怪的故障之外 一切都按预期进行 当用户单击其中一项而不是特定的开关对象时 它无论如何都会切换开关 我假设MouseDown当用户单击列
  • R 数据帧聚合列表

    我确实有 53 个数据框 purchase01 到purchase53 的列表 按日期排序 有 18 个变量和不同的行数 已尝试 但无法在下面粘贴示例 我想要总计的每个不同的数据帧通过其重复值 V9 因子 与列 V2 数字相加 我还没找到答
  • AFHTTPRequestOperationManager 返回块中的数据

    我在我的应用程序中创建了一个 APIController 它有几个方法可以调用特定的 api url 并返回一个用 api 调用结果填充的模型对象 该 API 使用 json 到目前为止我的代码如下所示 Definition MyModel
  • 自定义单元格:致命错误:在展开可选值时意外发现 nil

    我有一个带有创建为 xib 的自定义单元格的表格视图 我没有使用故事板 我有一个问题 我无法用来自网络服务结果的数据填充我的表 另外 我在自定义单元格中有 4 个标签 在我的自定义单元类中 当我尝试为每个项目设置标签时 它给了我如上所述的致
  • Django从apache获取环境变量

    我似乎无法让 Django 读取我从环境变量中配置的设置 我遵循了一些在线指南 并发现了一些其他问题 因此尝试配置如下 阿帕奇配置 WSGIScriptAlias v4 usr local myproject4 myproject4 wsg
  • 如何在 ASP.NET DataRepeater 控件中执行条件逻辑?

    我将 DataRepeater 控件绑定到具有许多列的表 我只想显示其中的一个子集 具体取决于填充的内容 我应该如何 在哪里进行数据中继器中的条件测试 这是我的 itemtemplate 中的代码 我得到的错误是 CS0103 名称 容器
  • 尝试从 python 写入 cassandra 时 CQL 查询中出现语法错误

    因此 我正在用 python 构建一个应用程序 该应用程序从 twitter 获取数据 然后将其保存到 cassandra 我当前的问题在于一个从kafka读取数据并尝试将其写入cassandra的脚本 如下所示 import thread
  • scala会自动关闭InputStream吗?

    我是 scala 的新手 不熟悉流关闭机制 我写了一些这样的代码 def loadResourceAsString path String val is this getClass getResourceAsStream path Sour
  • 过滤字符串列表,忽略其他项目的子字符串

    如何过滤包含字符串和子字符串的列表以仅返回最长的字符串 如果列表中的任何项目是另一个项目的子字符串 则仅返回较长的字符串 我有这个功能 有更快的方法吗 def filterSublist lst uniq lst for elem in l
  • WPF 和 3D 如何更改 3D 空间中的单个位置点?

    我在 WPF 中定义了一个非常简单的 3D 空间 它定义了一个 3D 矩形 我希望能够操作 MeshGeometry3D 上的每个 Point3D 对象 在 位置 中 属性 但我遇到了麻烦 这是我的 XAML
  • 具有多个项目的标题模板

    我正在尝试写一个HeaderTemplate对于扩展器 到目前为止 我注意到所有示例都使用 Binding 关键字从标题中获取数据 但是 如果 Header 中有多个控件会发生什么情况 如何指定应将这些控件插入到特定位置
  • 处理 Swing UI 中的异常(低级到高级以及异常包装)

    我希望在 Swing 应用程序中以有意义的方式处理异常 下面是里面的一个actionPerformed方法 这UiUtils showError显示一个 JOptionPane 其中带有一个显示 隐藏堆栈跟踪的按钮 ApplicationE
  • 一个简单的代码来快速检测任何信标

    我是快速编程的新手 我正在尝试开发检测信标的应用程序 但仍然无法检测到任何信标 let region CLBeaconRegion proximityUUID NSUUID UUIDString 11111111 1111 1111 111
  • Azure SDK、Trace.Information 和 WADLogsTable

    我正在使用 Azure SDK 2 5 在 NET 中编写新的云服务 我知道诊断发生了一些重大变化使用 2 5 SDK rekesae https msdn microsoft com en us library azure dn87397
  • 学习如何编写它们的示例解析器[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在寻找可以研究的解析器和 或解析器生成器的源代码 以便进一步发展我在学校课程中获得的技能 您知道任何类型的值得推荐的解析器吗 您应
  • PHP 文件形式的图像

    我对 PHP 相当陌生 我需要知道如何将文件显示为图像 例如 打开http example com script php http example com script php将显示图像 我的理由是我需要把它放在src的属性 img 我希望
  • 获取 Unicode 字符中字符串的“实际”长度

    给定一个像 xe2 x9c xae 例如 可以是其他类似 or 我想找到字符打印在屏幕上时的 实际 长度 例如 len len xe2 x9c xae 两者都返回 3 但它应该是 1 你可以这样尝试 unicodedata normaliz
  • 在 Python 中编译正则表达式

    我正在阅读 Doug Hellman 的 Python 标准库示例 并发现了这一点 1 3 2 编译表达式 re 包含用于将正则表达式作为文本字符串处理的模块级函数 但更有效的是compile程序经常使用的表达式 我无法理解他对为什么会出现