使用正则表达式提取多行SAS代码

问题描述 投票:0回答:1

我正在尝试使用Python遍历数千行SAS代码。我想提取代码的某些部分以进行打印或发送给其他功能。

我正在查看的SAS代码可能看起来像这样:

"""%macro msg (name= some_macro) ;
%put Hello World, my name is &name ;
 %mend ;"""

[我想捕获第一行和最后一行之间,即%macro%mend ;行之间的内容,因此“%put Hello World,我的名字是&name;”将作为一个组返回。

我可以使用以下方法实现此捕获:

re.compile(r"\%macro\s*?.*?\s*?\((.*)\)\s*?;\n(.*?)\n\s*\%mend\s*;")

因为(.*?)\n似乎与我想要的行匹配。

注意:我正在使用很多\s*,因为我在SAS代码中都看到了空格,这似乎是相当随机的。

但是,当SAS代码超过更多行(可能是2行或更多行时,我就无法进行模式匹配,因此,例如,

"""%macro msg (name= some_macro) ;
%put Hello World, my name is &name ;
%let something happen
%do something else
%mend ;"""

这里我想返回“%put Hello World,我的名字是&name;%让某些事情发生,做其他事情”全部归为一组。我曾尝试放入量词*+,但我不知道如何明确要检查整行的重复,而不仅仅是检查我将量词放在旁边的最后一个字符。我以这个为例:

r"\%macro\s*?.*?\s*?\((.*)\)\s*?;\n(.*?)\n+?\s*\%mend\s*;"

[此处,我试图指示行(.*?)\n可以在1到无限次之间重复,并且我想捕获该组。

我还尝试过使用re.MULTILINEre.DOTALL,并使用^和$以及点号作为行尾租约,但也未达到预期的结果。

[请帮助我更好地了解这一领域。谢谢

python regex sas multiline
1个回答
0
投票

您可以使用捕获组并匹配不以%mend开头的行。

百分号不需要转义,请注意,\s也可以匹配换行符。

%macro.*\r?\n((?:(?!\s*%mend).*\r?\n)+)\s*%mend ;

regex demo

© www.soinside.com 2019 - 2024. All rights reserved.