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