在Python正则表达式中,
re.compile("x"*50000)
Run Code Online (Sandbox Code Playgroud)
给我 OverflowError: regular expression code size limit exceeded
但是下面的一个没有得到任何错误,但它达到了100%的CPU,并在我的电脑上花了1分钟
>>> re.compile(".*?.*?.*?.*?.*?.*?.*?.*?.*?.*?"*50000)
<_sre.SRE_Pattern object at 0x03FB0020>
Run Code Online (Sandbox Code Playgroud)
这是正常的吗?
我应该假设,".*?.*?.*?.*?.*?.*?.*?.*?.*?.*?"*50000比短"x"*50000吗?
在Python 2.6,Win32上测试过
更新1:
看起来".*?.*?.*?.*?.*?.*?.*?.*?.*?.*?"*50000可以减少到.*?
那么,这个怎么样?
re.compile(".*?x"*50000)
Run Code Online (Sandbox Code Playgroud)
它确实编译,如果那个也可以减少到".*?x",它应该匹配字符串"abcx"或"x"单独,但它不匹配.
那么,我错过了什么吗?
更新2:
我的观点是不知道正则表达式源字符串的最大限制,我想知道"x"*50000溢出处理程序捕获的一些原因/概念,但不是".*?x"*50000.
这对我来说没有意义,这就是原因.
在溢出检查中它是缺少的东西或它只是很好或它真的溢出的东西?
任何提示/意见将不胜感激.
区别在于".*?.*?.*?.*?.*?.*?.*?.*?.*?.*?"*50000可以减少到".*?",同时"x"*50000必须在FSM中生成50000个节点(或者正则表达式引擎使用的类似结构).
编辑:好的,我错了.这不是那么聪明.之所以"x"*50000失败,但".*?x"*50000不是因为一个"代码项"的大小有限制."x"*50000将生成一个长项".*?x"*50000并将生成许多小项.如果你可以以某种方式拆分字符串文字而不改变正则表达式的含义,它会起作用,但我想不出办法做到这一点.