作者:杰仔 | 来源:互联网 | 2023-05-21 17:24
在Python正则表达式中,re.compile(x*50000)给我OverflowError:超出正则表达式代码大小限制但是跟随一个没有得到任何错误,但它达到了100%的C
在Python正则表达式中,
re.compile("x"*50000)
给我OverflowError:超出正则表达式代码大小限制
但是跟随一个没有得到任何错误,但它达到了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.
这对我来说没有意义,这就是为什么.
在溢出检查中它是缺少的东西或它只是很好或它真的溢出的东西?
任何提示/意见将不胜感激.
解决方法:
区别在于“.*?.*?.*?.*?.*?.*?.*?.*?.*?.*?”* 50000可以缩减为“.*?”,而“ x“* 50000必须在FSM中生成50000个节点(或正则表达式引擎使用的类似结构).
编辑:好的,我错了.这不是那么聪明. “x”* 50000失败的原因,但“.*?x”* 50000并不是对一个“代码项”的大小有限制. “x”* 50000将生成一个长项目,“.*?x”* 50000将生成许多小项目.如果你可以以某种方式拆分字符串文字而不改变正则表达式的含义,它会起作用,但我想不出办法做到这一点.