【发布时间】: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