簡體   English   中英

使用 Regex 提取多行 SAS 代碼

[英]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.MULTILINEre.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 ;

正則表達式演示| Python 演示

例如

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM