代码之家  ›  专栏  ›  技术社区  ›  YOU

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

  •  4
  • YOU  · 技术社区  · 15 年前

    在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 :

    我的观点是不知道regex源字符串的最大限制,我想知道 “X”* 50000 被溢出处理程序捕获,但不在上 ".*?x"*50000 .

    这对我来说没有意义,这就是为什么。

    它是溢出检查中缺少的东西,或者只是很好,或者它确实溢出了什么东西?

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

    2 回复  |  直到 15 年前
        1
  •  6
  •   LukáÅ¡ Lalinský    15 年前

    区别在于 ".*?.*?.*?.*?.*?.*?.*?.*?.*?.*?"*50000 可以减少到 ".*?" ,同时 "x"*50000 必须在FSM中生成50000个节点(或regex引擎使用的类似结构)。

    编辑: 好吧,我错了。不是很聪明。原因何在 “X”* 50000 失败了,但是 ".*?x"*50000 不是说有一个“代码项”的大小限制。 “X”* 50000 将生成一个长项目并 “*?x*50000 将生成许多小项目。如果您可以在不改变regex含义的情况下以某种方式拆分字符串文字,它就可以工作,但我想不出一种方法来做到这一点。

        2
  •  1
  •   ghostdog74    15 年前

    你想匹配50000“x”,对吗?你说什么?如果是这样的话,一个没有regex的替代方案

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

    如果要使用regex匹配50000“x”,可以使用range

    >>> 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中是否有可以用来增加这个限制的地方。