簡體   English   中英

使用perl正則表達式匹配跨越SAS中多行的模式

[英]Use perl regular expression to match a pattern that spans multiple lines in SAS

我有一個存儲在html.html中的HTML代碼段:

</head>
<body>
  <h4>Areas of interest</h4>
  <ul>
    <li>Interest</li>   
    <li>Interest</li>  
  </ul>
  <h4>Other</h4>
</body>

我已經構建了一個與模式匹配的REGEX模式(/<\\/h4>(\\w*\\W*)*<h4>/)來提取第一個</h4>標記和第二個<h4>標記之間的所有內容,但是如何我是否讓SAS在多行中搜索模式?

SAS代碼:

filename html; 

data interests (drop=pattern);
   length string $2500;
   IF _N_ = 1 THEN
      PATTERN = PRXPARSE("/<\/h4>(\w*\W*)*<h4>/");
   RETAIN PATTERN;
   infile html LRECL=2500;
   string $CHAR2500.;
   IF PRXMATCH(PATTERN,STRING) GT 0 THEN OUTPUT;
run;

目前我的結果空白。

我不認為你可以在SAS中這樣做。

SAS將您的html的每一行視為單獨的觀察; 如果你想整體解析它們,你需要一些邏輯來將它們連接在一起。 以下是一個適用於您的示例代碼的示例,但可能會在大量特殊情況下失敗。 正如評論者指出的那樣,如果可以,最好使用html解析器。

此示例在看到<h4>時啟動(或重新啟動)行連接,並在看到</h4>時輸出連接的行。

data interests (keep=multiline);
    length multiline $250;
    set html;
    string = trim(string);
    retain multiline;
    multiline = cats(multiline,string);
    if find(string,'<h4>') > 0 then multiline = string;
    if find(string,'</h4>') > 0 then do;
        output;
        multiline = '';
    end;
run;

跨多行進行SAS搜索的方法是改變SAS定義“行”的方式。

例如,您可以使用recfm=n ,它告訴SAS只是將文件視為完全沒有概念的字節流。 您還可以使用recfm=f ,它設置固定的行大小(可以任意大到機器的最大容量,但如果您想使用_infile_則32767是最大值)。

嘗試這個:

data want;
   infile 'path\yourhtml' truncover;
   length string $100;
   input @;
   if index(_infile_,'h4')>0 then do;
      string=prxchange('s/.*\>(.*)\<.*/$1/i',-1,_infile_);
      output;
   end;
run;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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