1

我正在编写一个 python 脚本,它需要从源文件中删除所有具有特定语法的方法。

假设我在源文件中有一些方法,就像这样。

fn difflml(args)[
       if [
            --blah 
           ]
       [ var ]
] -- END OF THE METHOD

--Othed method starts and stuffs

我可以使用正则表达式从源文件中剥离这些样式方法吗?

我不知道如何保持计数[]以便剥离整个方法。我在想的是保持计数[,当计数为 0 时],增加[和减少]并打印。

由于我对正则表达式相当陌生,我不确定这是否可以在正则表达式本身中完成。

4

3 回答 3

2

(仅)使用正则表达式无法正确执行此操作。由于[and]字符可以递归嵌套,所以不能使用正则表达式,因为正则表达式没有堆栈来跟踪匹配的括号。一个好的经验法则是,如果您有递归模式(可以嵌套在自身内部的模式),则不能使用正则表达式。

正确的方法是使用使用正则表达式的标记器,然后创建递归下降解析器。根据您编写解析器代码的技能,这将使您倒退几天的编码时间。

不正确但粗略有效的方法是认识到函数的开头和函数的结尾都将从相同的缩进级别开始。您可以创建一个与递归模式不匹配的特殊正则表达式,而只匹配函数定义的开头和从行首开始的右大括号之间的任何内容。这可能需要你一两个小时来编写和调试。

于 2012-10-02T11:46:55.470 回答
1

我想可以使用正则表达式,但是没有括号计数(这是正则表达式引擎无法做到的)。可以使用不情愿的量词来匹配第一次出现的方法结束括号(假设它总是第一个/唯一的字符在行上,或者 -- END ...总是存在注释)。

但在我看来,正则表达式不适合用于此目的的工具,因为它在长的多行和多分支代码上可能非常内存和时间效率低下。

考虑改为编写一个简单的解析器。

于 2012-10-02T11:02:03.010 回答
1

这是一个使用pyparsing的快速示例,它去除诸如“--END OF METHOD”之类的注释

from pyparsing import *

parser = nestedExpr('[', ']').setParseAction(keepOriginalText) + Group('--' + restOfLine).suppress()
print parser.transformString(text)

使用您的示例代码生成:

fn difflml(args)[
       if [
            --blah 
           ]
       [ var ]
]

--Othed method starts and stuffs
于 2012-10-02T12:24:18.850 回答