[英]Using Regex to extract multi-line SAS code
我正在嘗試使用 Python 來處理數千行 SAS 代碼。 我想提取要打印或發送到另一個函數的代碼的某些部分。
我正在查看的 SAS 代碼可能如下所示:
"""%macro msg (name= some_macro) ;
%put Hello World, my name is &name ;
%mend ;"""
我想捕獲第一行和最后一行之間的內容,即%macro
和%mend ;
line,so "%put Hello World, my name is &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 ; %let 某事發生 %do 其他事”作為一組返回。 我試過放入量詞, *
和+
但我不知道如何明確表示要檢查整行是否重復,而不僅僅是我將量詞放在旁邊的最后一個字符。 我將以此為例:
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 ;
解釋
%macro.*\\r?\\n
匹配 %macro 后跟該行的其余部分和換行符(
捕獲組 1
(?:
非捕獲組
(?!\\s*%mend)
負前瞻,如果右邊不是%mend
.*\\r?\\n
匹配整行和換行)+
關閉非捕獲組並重復 1+ 次以匹配至少一行)
關閉捕獲組 1\\s*%mend ;
例如
pattern = re.compile(r"%macro.*\r?\n((?:(?!\s*%mend).*\r?\n)+)\s*%mend ;")
print(re.findall(pattern, test_str))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.