在python正则表达式中,
re.compile("x"*50000)
给我
OverflowError: regular expression code size limit exceeded
但是下面的一个没有任何错误,但是它命中了100%的CPU,在我的PC上花了1分钟
>>> re.compile(".*?.*?.*?.*?.*?.*?.*?.*?.*?.*?"*50000)
<_sre.SRE_Pattern object at 0x03FB0020>
这正常吗?
我是否应该假设,
".*?.*?.*?.*?.*?.*?.*?.*?.*?.*?"*50000
比"x"*50000
短?在Python2.6、win32上测试
更新1:
看起来
".*?.*?.*?.*?.*?.*?.*?.*?.*?.*?"*50000
可以减少到.*?
那么,这个怎么样?
re.compile(".*?x"*50000)
它是编译的,如果这个也可以减少到
".*?x"
,那么它应该只与字符串"abcx"
或"x"
匹配,但它不匹配。那么,我有什么遗漏吗?
更新2:
我的意思是不知道regex源字符串的最大限制,我想知道溢出处理程序捕获
"x"*50000
的一些原因/概念,但不想知道".*?x"*50000
的原因/概念。这对我来说毫无意义,这就是原因。
它是溢出检查中丢失的东西,还是它很好,还是它真的溢出了什么东西?
如有任何提示/意见,将不胜感激。
最佳答案
不同之处在于".*?.*?.*?.*?.*?.*?.*?.*?.*?.*?"*50000
可以减少到".*?"
,而"x"*50000
必须在fsm中生成50000个节点(或regex引擎使用的类似结构)。
编辑:好吧,我错了。并不是那么聪明。"x"*50000
失败,但".*?x"*50000
不成功的原因是有一个“代码项”的大小限制。"x"*50000
将生成一个长项目,".*?x"*50000
将生成许多小项目。如果你可以在不改变正则表达式的意义的情况下分割字符串文字,它会起作用,但我想不出这样做的方法。