在Python中的正则表达式中,
它确实编译通过,如果它也可以简化为
re.compile("x"*50000)
出现了OverflowError: regular expression code size limit exceeded
错误,但是下面的代码没有报错,但是会导致CPU占用率达到100%,在我的电脑上需要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
。对我来说这没有意义,这是溢出检查中缺少了什么,还是一切都很好或者它确实溢出了什么?任何提示/意见将不胜感激。
re.compile("x"*50000)
没有被编译,但是re.compile(".*?x"*50000)
被编译了。 - YOUx{5000}
或x{500000}
或其他任何内容。当您达到限制时,就在那里了。知道限制在哪里有什么意义呢?除非(不太可能)您编写了一个真正过长的正则表达式,否则您不需要知道。这些不合理的正则表达式本来就不是明智的选择。 - S.Lott"x"*50000
被溢出处理程序捕获时,它可能会容易受到缓冲区溢出攻击,而".*?x"*50000
却不会,甚至".*?x"*100000
也不会吗? - YOU