比较不匹配正则表达式的速度

2024-02-23

下面的 Python 代码非常慢:

import re
re.match( '([a]+)+c', 'a' * 30 + 'b' )

如果用更大的常数替换 30,情况会变得更糟。

我怀疑由于连续的解析歧义+是罪魁祸首,但我在正则表达式解析和匹配方面不是很专家。这是Python正则表达式引擎的错误,还是任何合理的实现都会做同样的事情?

我不是 Perl 专家,但以下返回速度相当快

perl -e '$s="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaab"; print "ok\n" if $s =~ m/([a]+)+c/;'

并且增加“a”的数量不会显着改变执行速度。


我认为 Perl 足够聪明,可以将两者折叠起来+s 合而为一,而 Python 则不然。现在让我们想象一下,如果没有优化的话,引擎会做什么。请记住,捕获通常很昂贵。另请注意,两者+s 是贪婪的,因此引擎将尝试在一个回溯步骤中使用尽可能多的重复。每个要点代表一个回溯步骤:

  • 引擎使用尽可能多的[a]尽可能,并消耗全部三十as。然后它就不能再继续了,所以它留下了第一个重复,captures 30 as。现在下一个重复开始了,它试图用另一个重复消耗更多([a]+)但这当然行不通。然后是c无法匹配b.
  • 回头!扔掉最后的a被内在的重复所消耗。之后我们再次离开内部重复,因此引擎将capture 29 as。然后另一个+开始,再次尝试内部重复(消耗第 30 个a)。然后我们再次离开内部重复,这也离开了捕获组,因此第一个捕获被丢弃并且引擎captures最后a. c无法匹配b.
  • 回头!扔掉另一个a里面。我们capture 28 as。捕获组的第二个(外部重复)消耗了最后 2 个as 是captured. c无法匹配b.
  • 回头!现在我们可以在第二个重复中回溯并丢弃两个中的第二个a是。剩下的将是captured。然后我们第三次进入捕获组并且capture最后a. c无法匹配b.
  • 回头!降至27as 在第一次重复中。

这是一个简单的可视化。每一行代表一个回溯步骤,每组括号显示内部重复的一次消耗。大括号代表那些newly为该回溯步骤捕获,而在此特定回溯步骤中不会重新访问普通括号。我省略了b/c因为它永远不会匹配:

{aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}
{aaaaaaaaaaaaaaaaaaaaaaaaaaaaa}{a}
{aaaaaaaaaaaaaaaaaaaaaaaaaaaa}{aa}
(aaaaaaaaaaaaaaaaaaaaaaaaaaaa){a}{a}
{aaaaaaaaaaaaaaaaaaaaaaaaaaa}{aaa}
(aaaaaaaaaaaaaaaaaaaaaaaaaaa){aa}{a}
(aaaaaaaaaaaaaaaaaaaaaaaaaaa){a}{aa}
(aaaaaaaaaaaaaaaaaaaaaaaaaaa)(a){a}{a}
{aaaaaaaaaaaaaaaaaaaaaaaaaa}{aaaa}
(aaaaaaaaaaaaaaaaaaaaaaaaaa){aaa}{a}
(aaaaaaaaaaaaaaaaaaaaaaaaaa){aa}{aa}
(aaaaaaaaaaaaaaaaaaaaaaaaaa)(aa){a}{a}
(aaaaaaaaaaaaaaaaaaaaaaaaaa){a}{aaa}
(aaaaaaaaaaaaaaaaaaaaaaaaaa)(a){aa}{a}
(aaaaaaaaaaaaaaaaaaaaaaaaaa)(a){a}{aa}
(aaaaaaaaaaaaaaaaaaaaaaaaaa)(a)(a){a}{a}

和。所以。在。

请注意,最后引擎还将尝试子集的所有组合a(回溯到前 29a然后通过前 28as) 只是为了发现,c也不匹配a.

正则表达式引擎内部结构的解释基于分散的信息正则表达式.info http://www.regular-expressions.info/.

为了解决这个问题。只需删除其中之一即可+s。任何一个r'a+c'或者如果你do想要捕获的金额as use r'(a+)s'.

最后回答一下你的问题。我不认为这是 Python 正则表达式引擎中的错误,而只是(如果有的话)缺乏优化逻辑。这个问题通常无法解决,因此引擎假设您必须自己处理灾难性的回溯并不是太不合理。如果 Perl 足够聪明,能够识别足够简单的情况,那就更好了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

比较不匹配正则表达式的速度 的相关文章

  • 为什么 dataclasses.astuple 返回类属性的深层副本?

    在下面的代码中astuple函数正在执行数据类的类属性的深层复制 为什么它不能产生与函数相同的结果my tuple import copy import dataclasses dataclasses dataclass class Dem
  • 我应该使用 Python 双端队列还是列表作为堆栈? [复制]

    这个问题在这里已经有答案了 我想要一个可以用作堆栈的 Python 对象 使用双端队列还是列表更好 元素数量较少还是数量较多有什么区别 您的情况可能会根据您的应用程序和具体用例而有所不同 但在一般情况下 列表非常适合堆栈 append is
  • 如何从Python中的函数返回多个值? [复制]

    这个问题在这里已经有答案了 如何从Python中的函数返回多个变量 您可以用逗号分隔要返回的值 def get name you code return first name last name 逗号表示它是一个元组 因此您可以用括号将值括
  • Python 3d 绘图设置固定色阶

    我正在尝试绘制两个 3d 数组 第一个数组的 z 值在范围内 0 15 0 15 第二个来自 0 001 0 001 当我绘图时 色标自动遵循数据范围 如何设置自定义比例 我不想看到 0 001 的浅色 而应该看到 0 15 的浅色 如何修
  • PyQt 使用 ctrl+Enter 触发按钮

    我正在尝试在我的应用程序中触发 确定 按钮 我当前尝试的代码是这样的 self okPushButton setShortcut ctrl Enter 然而 它不起作用 这是有道理的 我尝试查找一些按键序列here http ftp ics
  • Spark SQL 中的 SQL LIKE

    我正在尝试使用 LIKE 条件在 Spark SQL 中实现联接 我正在执行连接的行看起来像这样 称为 修订 Table A 8NXDPVAE Table B 4 8 NXD V 在 SQL Server 上执行联接 A revision
  • 从 Powershell 脚本安装 Python

    当以管理员身份从 PowerShell 命令行运行以下命令时 可以在 Windows 11 上成功安装 Python c temp python 3 11 4 amd64 exe quiet InstallAllUsers 0 Instal
  • 使用 Python Oauthlib 通过服务帐户验证 Google API

    我不想使用适用于 Python 的 Google API 客户端库 但仍想使用 Python 访问 Google APIOauthlib https github com idan oauthlib 创建服务帐户后谷歌开发者控制台 http
  • 嵌套作用域和 Lambda

    def funct x 4 action lambda n x n return action x funct print x 2 prints 16 我不太明白为什么2会自动分配给n n是返回的匿名函数的参数funct 完全等价的定义fu
  • 如何匹配 R 中的所有匹配项?

    我有 1000 个名字的列表 说A 我还有另外 5 个名字的清单 说B 我想找出这5个名字出现在1000个号码列表中的第几行 例如 Amy 在 A 中可以出现 25 次 B 里有艾米 我想知道 Amy 出现在 A 中的哪些行 我以前使用过
  • Pandas 组合不同索引的数据帧

    我有两个数据框df 1 and df 2具有不同的索引和列 但是 有一些索引和列重叠 我创建了一个数据框df索引和列的并集 因此不存在重复的索引或列 我想填写数据框df通过以下方式 for x in df index for y in df
  • Python GTK+ 画布

    我目前正在通过 PyGobject 学习 GTK 需要画布之类的东西 我已经搜索了文档 发现两个小部件似乎可以完成这项工作 GtkDrawingArea 和 GtkLayout 我需要一些基本函数 如 fillrect 或 drawline
  • PySpark groupByKey 返回 pyspark.resultiterable.ResultIterable

    我试图找出为什么我的 groupByKey 返回以下内容 0
  • 为什么 csv.DictReader 给我一个无属性错误?

    我的 CSV 文件是 200 Service 我放入解释器的代码是 snav csv DictReader open screennavigation csv delimiter print snav fieldnames 200 for
  • 如果 PyPy 快 6.3 倍,为什么我不应该使用 PyPy 而不是 CPython?

    我已经听到很多关于PyPy http en wikipedia org wiki PyPy项目 他们声称它比现有技术快 6 3 倍CPython http en wikipedia org wiki CPython口译员开启他们的网站 ht
  • 重新分配唯一值 - pandas DataFrame

    我在尝试着assign unique值在pandas df给特定的个人 For the df below Area and Place 会一起弥补unique不同的价值观jobs 这些值将分配给个人 总体目标是使用尽可能少的个人 诀窍在于这
  • 如何在 Flask 中的视图函数/会话之间传递复杂对象

    我正在编写一个 Web 应用程序 当 且仅当 用户登录时 该应用程序从第三方服务器接收大量数据 这些数据被解析为自定义对象并存储在list 现在 用户在应用程序中使用这些数据 调用不同的视图 例如发送不同的请求 我不确定什么是最好的模式在视
  • 如何将Python3设置为Mac上的默认Python版本?

    有没有办法将 Python 3 8 3 设置为 macOS Catalina 版本 10 15 2 上的默认 Python 版本 我已经完成的步骤 看看它安装在哪里 ls l usr local bin python 我得到的输出是这样的
  • JSON:TypeError:Decimal('34.3')不是JSON可序列化的[重复]

    这个问题在这里已经有答案了 我正在运行一个 SQL 查询 它返回一个小数列表 当我尝试将其转换为 JSON 时 出现类型错误 查询 res db execute SELECT CAST SUM r SalesVolume 1000 0 AS
  • NLTK:查找单词大小为 2k 的上下文

    我有一个语料库 我有一个词 对于语料库中该单词的每次出现 我想获取一个包含该单词之前的 k 个单词和该单词之后的 k 个单词的列表 我在算法上做得很好 见下文 但我想知道 NLTK 是否提供了一些我错过的功能来满足我的需求 def size

随机推荐

  • 如何在Apple App Store产品描述中显示特殊字符?

    我发现一些应用程序 例如 Toodledo 使用复选标记来标记其修订历史记录 如何在 App Store 产品描述中显示 使用特殊字符 它允许 HTML 还是只需要使用 ascii 字符代码 有什么提示 技巧可以更好地展示我们应用程序的产品
  • 如何在 jqGrid 上实现自动换行(适用于 IE7、IE8 和 FF)

    如何在适用于 IE7 IE8 和 FF 的 jqGrid 上实现自动换行 同时还具有列大小调整功能 网格正确对齐 尝试使用特定宽度的 div 基于初始 TH 宽度 内包装每个 td 上的内容 但 colresize 不适用于我插入的 div
  • java.util.List 是可变的吗?

    我们可以add remove元素到List using add remove 方法而无需创建另一个看起来类似于的列表StringBuilder append 正因如此我认为List是可变的 谁能确认我的理解是正确的吗 如果有错误请解释一下下
  • PHP 忽略 POST 请求

    我正在尝试在 PHP 中创建一个即发即忘方法 以便我可以POST数据发送到网络服务器 无需等待响应 我读到这可以通过使用来实现CURL就像下面的代码一样 ch curl init url curl setopt ch CURLOPT POS
  • Postgres/hibernate 运算符不存在:text = bytea

    我是 hibernate 世界的新手 在尝试使用 hibernate 和 postgres 执行查询时收到以下错误消息 org postgresql util PSQLException ERROR operator does not ex
  • 是否有用于 Tkinter/网格几何图形的 GUI 设计应用程序? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道 GUI 设计应用程序可以让您选择 拖 放小部件 然后使用适当的 Tkinter 调用和排列将
  • 如何在golang中使用multipart

    我需要生成以下形式的多部分发布请求 POST blabla HTTP 1 1 Host 2 2 2 2 Authorization moreblabla Content Type multipart mixed boundary rs0q5
  • RxJava:尝试将错误传播到 Observer.onError 时发生错误

    我在 Rx 库中收到 IllegalStateException 错误 并且不知道问题的根源在哪里 无论是 RxJava 还是我可能做错的事情 当证书固定 发生在所有服务器请求上 但似乎指向会话超时或注销并返回时 会发生致命崩溃 重现步骤
  • CMake:将(独立)库拆分为不同的 target_link_libraries 调用?

    说我有目标A这取决于库B and C But B and C没有相互依赖 与 CMake 的链接可能看起来像 target link libraries A B C but target link libraries A B target
  • dll 的环境变量与 exe 的环境变量不同

    我正在调试一个 64 位应用程序 其中 c exe 使用本机 c dll 在 Windows 7 上 这两个应用程序的环境变量似乎不同 即使它们都在同一进程中执行 调用 System Environment SetEnvironmentVa
  • 您将如何对此进行逆向工程?

    我有一些代码位于 javascript 中的 php 文件的底部 它经历了很多奇怪的扭曲 比如将十六进制转换为 ascii 然后进行正则表达式替换 执行代码等等 有没有办法在它实际执行之前找出它正在执行的内容 代码在这里 http past
  • ASP.NET MVC 4:无法修改 jQuery Unobtrusive Ajax

    Using ASP NET MVC 4 and NuGet来管理包 升级到后jQuery 1 9 1 via NuGet 我开始得到JavaScript关于删除的错误live 函数于jQuery 1 9 x 我按 F5 从 VS NET 以
  • 三个 js - 克隆着色器并更改统一值

    我正在努力创建一个着色器来生成带有阴影的地形 我的出发点是克隆兰伯特着色器并使用 ShaderMaterial 最终用我自己的脚本对其进行自定义 标准方法效果很好 var material new MeshLambertMaterial m
  • 我缺少哪些 LinkedIn API 权限来获取组织目标名称?

    使用 LinkedIn API v2 0 我目前正在尝试获取他们作为管理员的经过身份验证的用户的组织 ID 和名称列表 我可以使用以下方法获取所有组织 ID https api linkedin com v2 organizationalE
  • pandas:如何在按列分组后获得第一个正数?

    我有一个 pandas 数据框 例如 a b id 1 10 6 1 2 6 3 1 3 3 12 1 First time id 1 has a b value over 10 4 4 23 2 First time id 2 has a
  • Safari 不会通过 HTTPS 播放 mp4

    我有一个文件sample html 其中仅包含以下代码
  • 在tinymce中禁用自动moxieplayer换行

    我构建了一个功能 可以上传 转换视频 然后将视频嵌入到tinymce 中 Tinymce 使用他们的 moxieplayer swf 不断用一些 html 封装我的视频嵌入 我想对这些视频使用自定义视频播放器 但当 tinymce 的行为如
  • 交错 NumPy 数组[重复]

    这个问题在这里已经有答案了 我正在尝试按如下方式交错数组 import numpy as np x np array 1 2 3 4 5 y np array 4 6 2 6 9 5 9 8 7 4 3 2 5 4 9 期望的结果 1 2
  • 设定差值的输出可以存储在第一个输入中吗?

    如果我有 2 个向量 或双端队列 我可以将它们的 set difference 存储在第一个向量中吗 又名来自 cpp wiki 参考的示例 std vector
  • 比较不匹配正则表达式的速度

    下面的 Python 代码非常慢 import re re match a c a 30 b 如果用更大的常数替换 30 情况会变得更糟 我怀疑由于连续的解析歧义 是罪魁祸首 但我在正则表达式解析和匹配方面不是很专家 这是Python正则表