我正在尝试使用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.MULTILINE
和re.DOTALL
,并使用^和$以及点号作为行尾租约,但也未达到预期的结果。
[请帮助我更好地了解这一领域。谢谢
您可以使用捕获组并匹配不以%mend开头的行。
百分号不需要转义,请注意,\s
也可以匹配换行符。
%macro.*\r?\n((?:(?!\s*%mend).*\r?\n)+)\s*%mend ;