如何使用Python正则表达式匹配MATLAB的函数语法?

leo*_*on 3 python regex matlab

我试图在我们的内部库中找到所有MATLAB函数的所有输入/输出.我是新的(第一次)正则表达式,并一直试图在Python的re库中使用多行模式.

MATLAB函数语法如下:

function output = func_name(input)
Run Code Online (Sandbox Code Playgroud)

签名可以跨越多行.

我开始使用如下模式:

re.compile(r"^.*function (.*)=(.*)\([.\n]*\)$", re.M)
Run Code Online (Sandbox Code Playgroud)

但我一直得到一个不受支持的模板操作符错误.任何指针都很赞赏!

编辑:

我现在有:

pattern = re.compile(r"^\s*function (.*?)= [\w\n.]*?\(.*?\)", re.M|re.DOTALL)
Run Code Online (Sandbox Code Playgroud)

给出如下匹配的匹配:

        function [fcst, spread] = ...
                VolFcstMKT(R,...
                           mktVol,...
                           calibrate,...
                           spread_init,...
                           fcstdays,...
                           tsperyear)

        if(calibrate)
            if(nargin < 6)
                tsperyear = 252;
            end
            templen = length(R)
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么它会给出额外的线而不是在第一线停下来)

Ale*_*lli 5

如果您传递re.T而不是re.M作为第二个参数re.compile(re.template- 当前未记录的条目 - 是打算使用它的那个,并且,简而言之,模板RE不支持,那么您应该得到的特殊(内部)错误重复或回溯).你可以print re.M在调用之前在代码中显示它的价值re.compile吗?

一旦修复了,我们就可以讨论你想要的RE的细节(简而言之:如果input部分可以包括括号你运气不好,否则re.DOTALL你的模式的一些改写应该有帮助) - 但修复这个奇怪的内部错误发生似乎优先考虑

编辑:有这个bug诊断(按照这个问答下面的评论),移动到OP当前的问题:re.DOTALL|re.MULTINE加上"$"的模式结束,再加上无处不在贪婪匹配(使用.*,而不是.*?用于非贪婪的),一起确保如果正则表达式匹配,它将尽可能广泛地匹配......这正是这个组合所要求的.可能最好用一个特定的例子打开另一个Q:输入是什么,匹配什么,你想要正则表达式匹配什么,等等.