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

标签 python regex python-3.x sas

我正在尝试使用相当复杂的正则表达式。 检查我的结果,我发现我的一些较长的编译模式被缩短了——特别是 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/

相关文章:

python - argparse 参数可以是 str 或 int 以及处理它的最简单方法

python - numpy - 沿轴的点积之和

RegExp 匹配所有直到两个连续的特殊字符 (]])

django - dreamhost python3 Django乘客设置导入Cookie

javascript - 圆圈在图表 D3 Django 上没有正确对齐

python - 使用输入更改文件的一部分 - python

python - 无法运行 python manage.py 检查

python - 异步键盘中断和多线程

php - 使用 preg_match 检查字符串是否仅包含 A-Z、a-z 和 -(破折号)字符

arrays - Powershell 从包含大量字符串的大文本文件中删除任何行