Html 使用perl正则表达式匹配SAS中跨多行的模式
我在HTML.HTML中存储了这样一个HTML片段:Html 使用perl正则表达式匹配SAS中跨多行的模式,html,regex,sas,Html,Regex,Sas,我在HTML.HTML中存储了这样一个HTML片段: </head> <body> <h4>Areas of interest</h4> <ul> <li>Interest</li> <li>Interest</li> </ul> <h4>Other</h4> </body> 感兴趣的领域 利息
</head>
<body>
<h4>Areas of interest</h4>
<ul>
<li>Interest</li>
<li>Interest</li>
</ul>
<h4>Other</h4>
</body>
感兴趣的领域
- 利息
- 利息
其他
我已经构建了一个正则表达式模式(/(\w*\w*)*/)
,该模式匹配第一个
标记和第二个
标记之间的所有内容,但是如何让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;
html文件名;
数据兴趣(下降=模式);
长度为2500美元;
如果N=1,则
PATTERN=PRXPARSE(“/(\w*\w*)*/”;
保留模式;
填充html LRECL=2500;
字符串:2500美元。;
如果PRXMATCH(模式、字符串)GT 0,则输出;
跑
目前我得到的结果是空白的。我认为在SAS中你不能这样做 SAS将html的每一行视为一个单独的观察值;如果要将它们作为一个整体进行解析,则需要一些逻辑将它们连接在一起。下面的示例适用于示例代码,但可能会在大量特殊情况下失败。正如评论者所指出的,如果可以的话,最好使用html解析器 此示例在看到
时启动(或重新启动)行连接,并在看到
时输出连接的行
数据兴趣(保持=多行);
长度多行250美元;
设置html;
字符串=修剪(字符串);
保留多行;
多行=猫(多行,字符串);
如果查找(字符串“”)>0,则多行=字符串;
如果查找(字符串“”)>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;
需要数据;
填充'path\yourhtml'truncover;
长度字符串$100;
输入@;
如果索引(_infle,'h4')>0,则执行该操作;
string=prxchange('s/*\>(.*)\让SAS跨多行搜索的方法是更改SAS定义“行”的方式
例如,您可以使用<代码> RefFM=n>代码>,它告诉SAS只考虑文件在所有行中没有概念的字节流,也可以使用<代码> ReFMF=代码>代码>,它设置固定的行大小。(可以任意大到机器的最大容量,但如果您想使用
\u infle\u
,32767是最大容量)。试试PATTERN=PRXPARSE(“/(?为什么要标记Perl?@DaveCross是因为Perl的一个特性是自然表达式。@Stribizev如果不清楚,很抱歉,问题是SAS代码,而不是Perl表达式。Perl表达式与行匹配,我已经在在线测试程序中测试过,例如@DaveCross Ok,你赢了。这不是Perl问题Hey Shenglin,谢谢suggestion。不幸的是,它成功地提取了h4标记之间的标题,但没有提取下面的点。原因是您的代码一次只检查一行。感谢您的建议。我很高兴您确认我不能使SAS同时接收多行。我自己也倾向于连接,今天我实现了一个ve你的代码的版本,所以非常感谢你!
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;