正则表达式字符匹配计数器

时间:2012-10-02 10:55:09

标签: python regex python-3.x

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

假设我在源文件中有一些类似的方法。

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

--Othed method starts and stuffs

我可以使用正则表达式从源文件中删除这些样式方法。

我不知道如何计算[]以便剥离整个方法。 我在想的是继续对[]进行计数,在[上递增并在]递减,并在计数为0时打印。

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

3 个答案:

答案 0 :(得分:2)

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

正确的方法是使用正则表达式的tokenizer,然后创建递归下降解析器。根据您编写解析器代码的技巧,这将为您提供几天的编码。

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

答案 1 :(得分:1)

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

在我看来,正则表达式不是用于此目的的合适工具,因为它可能对长多行和多分支代码的内存和时间无效。

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

答案 2 :(得分:1)

以下是使用pyparsing删除评论的快速示例,例如“ - 结束方法”

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