在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将生成许多小项目。如果你可以在不改变正则表达式的意义的情况下分割字符串文字,它会起作用,但我想不出这样做的方法。

10-07 14:34