2012-10-02 59 views
1

我正在写一个python脚本,它需要从源文件中去除具有特定语法的所有方法。正则表达式字符匹配计数器

假设我有出外源文件中的一些方法。

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

--Othed method starts and stuffs 

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

我不知道如何继续计数[],以便剥离整个方法。 我在想什么是保持在[]计数,增加对[]和打印递减,当计数为0。

由于我是相当新的正则表达式,我不知道这是否可以在正则表达式本身来完成。

+0

你可以试试这个正则表达式: - '( “(。*?)\\ [。* \\]”)' –

+0

你想达到什么目的? – root

回答

1

我想这是可以做到用正则表达式,但不带括号计算(这是正则表达式引擎不能做)。可以使用不情愿的量词来代替第一次出现的方法结束括号(假设它始终是首行/唯一的字符,或者总是存在注释)。

在我看来不过正则表达式是不是这样的目的合适的工具,“因为它是非常的内存和时间无效在长期多线,多分支代码。

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

2

这是不可能的(只有)一个正则表达式做正确。由于[]字符可以递归嵌套,所以不能使用正则表达式,因为正则表达式没有堆栈来跟踪匹配的括号。拇指的一个很好的规则是,如果你有递归模式(模式可以嵌套在自己内部),你不能使用正则表达式。

正确方法将使用使用正则表达式的标记器,然后创建一个递归下降解析器。根据你编写解析器代码的技巧,这会让你回到编程几天。

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

1

这里有一个简单的例子使用pyparsing这条评论,如 “ - END法”

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