【发布时间】:2010-01-04 08:42:57
【问题描述】:
在 Python 正则表达式中,
re.compile("x"*50000)
给我OverflowError: regular expression code size limit exceeded
但是下面的一个没有得到任何错误,但它达到了 100% CPU,并且在我的 PC 上花了 1 分钟
>>> re.compile(".*?.*?.*?.*?.*?.*?.*?.*?.*?.*?"*50000)
<_sre.SRE_Pattern object at 0x03FB0020>
这正常吗?
我应该假设".*?.*?.*?.*?.*?.*?.*?.*?.*?.*?"*50000 比"x"*50000 短吗?
在 Python 2.6、Win32 上测试
更新 1:
看起来".*?.*?.*?.*?.*?.*?.*?.*?.*?.*?"*50000 可以简化为.*?
那么,这个怎么样?
re.compile(".*?x"*50000)
它确实可以编译,如果那个也可以减少到".*?x",它应该只匹配字符串"abcx"或"x",但它不匹配。
那么,我错过了什么吗?
更新 2:
我的意思是不知道正则表达式源字符串的最大限制,我想知道溢出处理程序捕获的"x"*50000 的一些原因/概念,但不是".*?x"*50000。
这对我来说没有意义,这就是原因。
溢出检查时缺少一些东西,或者它很好,或者它真的溢出了一些东西?
任何提示/意见将不胜感激。
【问题讨论】:
-
No ".*?x"5000 不会缩减为 ".?x" - 它会缩减为包含 5000 个 x 的正则表达式,其中包含 ".*? "在每个 x 之前。这就是它不匹配“abcx”或“x”的原因——它只会匹配一个有 5000 个 x 的字符串。
-
它提醒我,当我尝试将 SVG 路径的 ABNF 转换为正则表达式时,我达到了 PHP 正则表达式的最大长度。所以,恕我直言,很高兴知道答案。
-
@Dave Kirby,谢谢,但它是 50000 (50k)。我最初的问题是
re.compile("x"*50000)没有被编译,但是re.compile(".*?x"*50000)被编译了。 -
为什么需要知道最大正则表达式?编写您需要的正则表达式。
x{5000}或x{500000}或其他。当你达到极限时,你就在那里。知道极限在哪里有什么意义?即使您编写了一个太长的真实正则表达式,您也不需要知道(不太可能)。不是这些首先不是明智的正则表达式的退化案例。 -
@S.Lott,你是对的,知道限制根本没有意义,但是,当
"x"*50000被溢出处理程序捕获时,你不认为它可能容易受到缓冲区溢出的影响,但".*?x"*50000没有,甚至".*?x"*100000也没有。