如何克服python中的正则表达式深度限制?

时间:2018-12-04 17:15:54

标签: python regex python-3.x sas

我正在尝试使用复杂的正则表达式。 查看我的结果,我发现一些较长的编译模式被缩短了,特别是缩短到200个。

这引起了我的兴趣,我found认为SAS中的深度限制为200:

  

捕获子图案的最大数量为65535,最大数量为   捕获和非捕获所有子模式的嵌套深度,   是200。

我找不到报价来确认python中的情况,但根据我的经验来看似乎是这样-逻辑上假设SAS正则表达式引擎存在此确切的数值限制这一事实可能是合乎逻辑的指出python中也存在一些默认上限。

此上限定义了吗? 我该如何克服它,并定义自己的上限? 我在python-3文档中找不到这个。

一个例子:

import re
a="""'AAAAAAAAAAAAAAAAAAA\\ \\-\\ AAAAAAA\\ AAAAAAAAAAAA\\ AAAAAAA\\ AAAA\\ AAAAAAAAAAAAAA\\=".*"\\,\\ AAAAAAAAAA\\="AAAAAAAAAA\\:\\ \'AAAAAAAAAAA0\'\\,\\ AAA\\:\\ \'.*\'\\,\\ AAAAAAA.*AAAAAAA.*CCCC\\:\\ \'BBBBBBBBBBBBB\'\\,\\ BBBBBBBBBBBBBBBB\\:\\ \'\'\\,\\ BBBBB\\:\\ \'\'\\,\\ BBBBBBB\\:\\ \'BBBBBBBBBBB\'\''
"""
b=re.compile(a)
print (a)
print (b)

打印:

'AAAAAAAAAAAAAAAAAAA\ \-\ AAAAAAA\ AAAAAAAAAAAA\ AAAAAAA\ AAAA\ AAAAAAAAAAAAAA\=".*"\,\ AAAAAAAAAA\="AAAAAAAAAA\:\ 'AAAAAAAAAAA0'\,\ AAA\:\ '.*'\,\ AAAAAAA.*AAAAAAA.*CCCC\:\ 'BBBBBBBBBBBBB'\,\ BBBBBBBBBBBBBBBB\:\ ''\,\ BBBBB\:\ ''\,\ BBBBBBB\:\ 'BBBBBBBBBBB'''

re.compile('\'AAAAAAAAAAAAAAAAAAA\\ \\-\\ AAAAAAA\\ AAAAAAAAAAAA\\ AAAAAAA\\ AAAA\\ AAAAAAAAAAAAAA\\=".*"\\,\\ AAAAAAAAAA\\="AAAAAAAAAA\\:\\ \'AAAAAAAAAAA0\'\\,\\ AAA\\:\\ \'.*\'\\,\\ AAAAAAA.*AAAAAAA.*CCCC\\:\\)

正则表达式在示例中的“ C”之后,“ B”之前被剪切。

已编译正则表达式内部的大小

'\'AAAAAAAAAAAAAAAAAAA\\ \\-\\ AAAAAAA\\ AAAAAAAAAAAA\\ AAAAAAA\\ AAAA\\ AAAAAAAAAAAAAA\\=".*"\\,\\ AAAAAAAAAA\\="AAAAAAAAAA\\:\\ \'AAAAAAAAAAA0\'\\,\\ AAA\\:\\ \'.*\'\\,\\ AAAAAAA.*AAAAAAA.*CCCC\\:\\

正好是200。

答案后编辑:正如user2357112所写,匹配保持不变。

import re
a="""'AAAAAAAAAAAAAAAAAAA22 22-22 AAAAAAA22 AAAAAAAAAAAA22 AAAAAAA22 AAAA22 AAAAAAAAAAAAAA22=".*"22,22 AAAAAAAAAA22="AAAAAAAAAA22:22 2'AAAAAAAAAAA02'22,22 AAA22:22 2'.*2'22,22 AAAAAAA.*AAAAAAA.*CCCC22:22 2'BBBBBBBBBBBBB2'22,22 BBBBBBBBBBBBBBBB22:22 2'2'22,22 BBBBB22:22 2'2'22,22 BBBBBBB22:22 2'BBBBBBBBBBB2'2''
"""
b=re.compile(a)

x="""'AAAAAAAAAAAAAAAAAAA22 22-22 AAAAAAA22 AAAAAAAAAAAA22 AAAAAAA22 AAAA22 AAAAAAAAAAAAAA22="777"22,22 AAAAAAAAAA22="AAAAAAAAAA22:22 2'AAAAAAAAAAA02'22,22 AAA22:22 2'7772'22,22 AAAAAAA777AAAAAAA777CCCC22:22 2'BBBBBBBBBBBBB2'22,22 BBBBBBBBBBBBBBBB22:22 2'2'22,22 BBBBB22:22 2'2'22,22 BBBBBBB22:22 2'BBBBBBBBBBB2'2''
"""

y="""'AAAAAAAAAAAAAAAAAAA22 22-22 AAAAAAA22 AAAAAAAAAAAA22 AAAAAAA22 AAAA22 AAAAAAAAAAAAAA22="777"22,22 AAAAAAAAAA22="AAAAAAAAAA22:22 2'AAAAAAAAAAA02'22,22 AAA22:22 2'7772'22,22 AAAAAAA777AAAAAAA777CCCC22:22 2'BBBBBBBBBBBBB2'22,22 BBBBBBBBBBBBBBBB22:22 2'2'22,22 BBBBB22:22 2'2'22,22 BBBBBBB22:22 2'BBBBBBBBBDD2'2''
"""

if (b.fullmatch(x)):
    print ("x matched!")

if (b.fullmatch(y)):
    print ("y matched!")

这确实只匹配x而不匹配y,即使它们之间的区别不是打印正则表达式时显示的部分。

1 个答案:

答案 0 :(得分:4)

这是模式对象__repr__的假象,由于某种原因,该对象将基础模式字符串的repr截断为200个字符:

result = PyUnicode_FromFormat("re.compile(%.200R)", obj->pattern);

这不会影响匹配。没有200个字符的限制。