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

如何克服python中的正则表达式深度限制?,python,regex,python-3.x,sas,Python,Regex,Python 3.x,Sas,我试图使用更复杂的正则表达式。 检查我的结果,我发现我的一些较长的编译模式被缩短了,特别是长度被缩短到200 这引起了我和我的兴趣,200是SAS的深度限制: 捕获子模式的最大数量为65535,最大 捕获和非捕获的所有子模式的嵌套深度, 是200 我找不到一句话来证实python中的情况,但根据我的经验,这似乎是正确的——假设SAS正则表达式引擎中存在这个精确的数字限制,python中也存在一些默认上限,这可能是合乎逻辑的 这个上限有定义吗? 我怎样才能克服它,定义我自己的帽子? 我在pytho

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

这引起了我和我的兴趣,200是SAS的深度限制:

捕获子模式的最大数量为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'''

在本例中,正则表达式在Cs之后、Bs之前被剪切

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

'\'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,即使它们之间的差异不是打印正则表达式时显示的部分。

这是pattern对象的工件,出于某种原因,它将底层模式字符串的repr截断为200个字符:

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

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

这是pattern对象的工件,出于某种原因,它将底层模式字符串的repr截断为200个字符:

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

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

这似乎只是_urepr_;的一个问题。你检查过b.模式吗?事实上,问题只出在repr上,正如你从下面基于你的回答的回答后编辑中所看到的。看起来这可能只是repr的问题。您是否检查了b.pattern?事实上,问题只存在于repr中,正如您从下面基于您的响应的回答后编辑中所看到的。某些函数的返回变量长度为200,例如tranwrd,如果之前未在数据步骤中设置,则将作为pdv变量长度应用。因此,变量可能是基于函数调用设置的,或者仅仅是studio产品或引擎实现的内部设置,然后将长度设置为$200。@Richard:你是说SAS吗?我在CPython源代码中没有看到tranwrd,但我在谷歌上看到了一大堆SAS对tranwrd的点击。CPython的重新实现可能在某个地方有局限性,但不管它们是什么,我都不知道。我的评论是基于文档链接到SAS产品数据流量,并进一步猜测其中的某个地方,实现限制是由于某些数据步骤处理(所有推测)而产生的。某些函数返回的变量长度为200,如tranwrd,如果之前未在数据步骤中设置,则将作为pdv变量长度应用。因此,变量可能是基于函数调用设置的,或者仅仅是studio产品或引擎实现的内部设置,然后将长度设置为$200。@Richard:你是说SAS吗?我在CPython源代码中没有看到tranwrd,但我在谷歌上看到了一大堆SAS对tranwrd的点击。CPython的重新实现可能在某个地方有限制,但不管它们是什么,我都不知道。我的评论是基于文档链接与SAS产品数据流量的关系,并进一步猜测其中的某个地方,实现限制是由于一些数据步进处理引起的——所有猜测。