我正在尝试使用相当复杂的正则表达式。 检查我的结果,我发现我的一些较长的编译模式被缩短了——特别是 200 的长度。
这激起了我的兴趣,我 found 200 是 SAS 中的深度限制:
The maximum number of capturing subpatterns is 65535, and the maximum depth of nesting of all subpatterns, both capturing and non-capturing, is 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
,即使它们之间的区别不是打印正则表达式时显示的部分。
最佳答案
这是模式对象的 __repr__
的产物,出于某种原因将基础模式字符串的 repr
截断为 200 个字符:
result = PyUnicode_FromFormat("re.compile(%.200R)", obj->pattern);
这不影响匹配。没有 200 个字符的限制需要克服。
关于python - 如何克服 python 中的正则表达式深度限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53618278/