【问题标题】:Regex character match counter正则表达式字符匹配计数器
【发布时间】:2012-10-02 10:55:08
【问题描述】:

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

假设我在一个源文件中有一些方法。

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

--Othed method starts and stuffs

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

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

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

【问题讨论】:

  • 你可以试试这个正则表达式:-("(.*?)\\[.*\\]")
  • 你想达到什么目的?

标签: python regex python-3.x


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-11
        • 2012-06-05
        • 2013-12-25
        • 1970-01-01
        相关资源
        最近更新 更多