正则表达式字符匹配

2024-04-25 23:21:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个python脚本,它需要从源文件中剥离所有具有特定语法的方法。你知道吗

假设在源文件中有一些方法,如下所示。你知道吗

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

--Othed method starts and stuffs

我可以使用regex从源文件中剥离这些样式方法吗。你知道吗

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

由于我对regex还比较陌生,我不确定是否可以在regex本身中实现这一点。你知道吗


Tags: ofthe方法脚本ifvar语法args
3条回答

下面是一个使用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

这是不可能的正确与(只有)正则表达式。因为[]字符可以递归嵌套,所以不能使用正则表达式,因为正则表达式没有跟踪匹配括号的堆栈。一个好的经验法则是,如果您有递归模式(可以嵌套在其内部的模式),就不能使用正则表达式。你知道吗

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

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

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

然而,在我看来,regex不适合用于这样的目的,因为在长的多行和多分支代码中,它可能是非常内存和时间无效的。你知道吗

考虑编写一个简单的解析器。你知道吗

相关问题 更多 >