我将使用此脚本提取一些抓取数据的名称和 ID:
if ( $string =~ m/(;r=\d*.*<)/ ) {
$mystring = $1;
$mystring =~ s/;//;
if ( $mystring =~ m/(>.*<)/ ) {
$mystring = $1;
$mystring =~ s/>//;
$mystring =~ s/<//;
print "$mystring \n";
}
}
其中$string
每次迭代包含输入文件的一行。以下是一些行:
<pre>
<option data-url="/nav/extra/list?s=prix_asc&cat=436&npk=1&b=4294959199&r=4294959195" >ZAN 3713</option>
<option data-url="/nav/extra/list?s=prix_asc&cat=436&npk=1&b=4294959199&r=4294959194" >ZAN2310</option>
<option data-url="/nav/extra/list?s=prix_asc&cat=436&npk=1&b=4294959199&r=4294959193" >ZAN2410</option>
我通常期望的是 ;r=4294959193" >ZAN2410<
作为结果;但问题是 Perl 没有检测到任何匹配!
我的正则表达式有问题吗?
最佳答案
是的,可能有。但老实说,我可能会采取不同的方式来解决这个问题。使用 HTML 解析器是第一个途径。
例如 - 您正在重复使用 $mystring
,这通常是一个警告信号,表明您没有使用 strict
和 警告
,因此正在做您不期望的事情。
您没有得到您想要的输出,因为您用此位覆盖了 $mystring
,例如:
if($mystring =~ m/(>.*<)/){
$mystring = $1;
但是使用示例数据运行代码后 - 看起来几乎可以工作 - 因为你正在破坏 $mystring
你得到:
ZAN 3713
ZAN2310
ZAN2410
不过我建议采用稍微不同的方法:
while (<DATA>) {
m/r=(\d+)\"\s*>([^<]+)/g && print "$1 $2\n";
}
__DATA__
<pre>
<option data-url="/nav/extra/list?s=prix_asc&cat=436&npk=1&b=4294959199&r=4294959195" >ZAN 3713</option>
<option data-url="/nav/extra/list?s=prix_asc&cat=436&npk=1&b=4294959199&r=4294959194" >ZAN2310</option>
<option data-url="/nav/extra/list?s=prix_asc&cat=436&npk=1&b=4294959199&r=4294959193" >ZAN2410</option>
这将为您提供以下输出:
4294959195 ZAN 3713
4294959194 ZAN2310
4294959193 ZAN2410
关于正则表达式在 Perl 中不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35989809/