Python的正则表达式源字符串长度

时间:2010-01-04 08:42:58

标签: python regex

在Python正则表达式中,

re.compile("x"*50000)

给了我OverflowError: regular expression code size limit exceeded

但是跟随一个没有得到任何错误,但它达到了100%的CPU,并在我的电脑中花了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没有。

这对我来说没有意义,这就是原因。

在溢出检查中它缺少什么,或者它很好或者它真的溢出了什么?

任何提示/意见将不胜感激。

2 个答案:

答案 0 :(得分:6)

不同之处在于".*?.*?.*?.*?.*?.*?.*?.*?.*?.*?"*50000可以缩减为".*?",而"x"*50000必须在FSM中生成50000个节点(或正则表达式引擎使用的类似结构)。

编辑:好的,我错了。这不是那么聪明。 "x"*50000失败的原因,但".*?x"*50000不是因为一个“代码项”的大小有限制。 "x"*50000将生成一个长项目,".*?x"*50000将生成许多小项目。如果你可以以某种方式拆分字符串文字而不改变正则表达式的含义,它就可以工作,但我想不出办法做到这一点。

答案 1 :(得分:1)

你要匹配50000“x”s,正确???如果是这样,没有正则表达式的替代方案

if "x"*50000 in mystring:
    print "found"

如果你想使用正则表达式匹配50000“x”,你可以使用范围

>>> pat=re.compile("x{50000}")
>>> pat.search(s)
<_sre.SRE_Match object at 0xb8057a30>

在我的系统上,它的最大长度为65535

>>> pat=re.compile("x{65536}")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/re.py", line 188, in compile
    return _compile(pattern, flags)
  File "/usr/lib/python2.6/re.py", line 241, in _compile
    p = sre_compile.compile(pattern, flags)
  File "/usr/lib/python2.6/sre_compile.py", line 529, in compile
    groupindex, indexgroup
RuntimeError: invalid SRE code
>>> pat=re.compile("x{65535}")
>>>

我不知道Python中是否有调整我们可以用来增加这个限制。