我有一个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;
目前我的结果空白。
答案 0 :(得分:2)
我认为你不能这样在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;
答案 1 :(得分:1)
跨多行进行SAS搜索的方法是改变SAS定义&#34; line&#34;的方式。
例如,您可以使用recfm=n
,它告诉SAS只是将文件视为完全没有概念的字节流。您还可以使用recfm=f
,它设置固定的行大小(可以任意大到机器的最大容量,但如果您想使用_infile_
则32767是最大值)。
答案 2 :(得分:0)
试试这个:
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;