【问题标题】:Python regex catastrophic backtracking in large strings (JavaScript parser)大字符串中的 Python 正则表达式灾难性回溯(JavaScript 解析器)
【发布时间】:2021-11-19 18:22:03
【问题描述】:

我正在尝试解析具有巨大功能的美化 JavaScript 文件。我要做的是将每个函数分成一个匹配对象,然后单独处理它们以做其他事情。

一个例子可以是:

__d(function(e, t, n, r, i, l, a) {

//AnyCharacters

}, 93, [27, 38, 40, 37, 94, 98, 99, 32]);

我正在尝试以下正则表达式:

(?s)__d\(function\((\w+,\s)+\w+\)\s\{(.*?)\},\s\d+(.*?)\d\]\)\;

为了获得更多上下文,我尝试在进行更多处理后将每个函数写入文件:

functions_sep_regex = re.compile(r'(?s)__d\(function\((\w+,\s)+\w+\)\s\{(.*?)\},\s\d+(.*?)\d\]\)\;')

functions_sep = functions_sep_regex.finditer(res)

for functions in functions_sep:
        # Do something with functions.group(0))

回溯的问题是第一个(.*?),因为我试图获取函数开头和结尾之间的任何字符。

正则表达式必须回溯,这是预期的,因为它试图匹配任何字符(甚至是换行符),但由于这个错误,引擎崩溃了。

有没有办法避免这种“崩溃”?

编辑:

可重现的示例:pastebin.com/PcdSWnWG

【问题讨论】:

  • 我认为你需要给我们一个可重现的例子。 This particular example happens to be working.
  • @Jan 我看到那里有一股味道,但我不敢回答,因为我无法在 Python 中重现它。如果你愿意,你可以给出答案。
  • 试试(?s)__d\(function\(\w+(,\s+\w+)*\)\s\{([^{}]*)\},\s\d(.*?)\d\]\); (demo)。
  • @WiktorStribiżew 它没有得到所有的匹配。有 6 个以 __d(function(g, r, i, a, m, e, d) 开头的函数,而该表达式只有 2 个匹配项。
  • 好的,6 个匹配项:regex101.com/r/ZNuLVQ/2

标签: python python-3.x regex


【解决方案1】:

问题不在于(.*?),而是嵌套量词:

functions_sep_regex = re.compile(r'(?s)__d\(function\((\w+,\s)+\w+\)\s\{(.*?)\},\s\d+(.*?)\d\]\)\;')
#                                                           ^^^

当正则表达式引擎想要报告匹配时,该组可能会爆炸。
使用++(所有格)或改写这部分表达。

【讨论】:

  • 好的...但是你也应该给出正确的模式。只是告诉 OP 这是错误的不是一个实际的解决方案:-)
  • @TimBiegeleisen:完全同意你的看法——但是我需要更多输入示例。让我们等待 OP 说什么 - 如果有的话。
猜你喜欢
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
相关资源
最近更新 更多