免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: iamlimeng
打印 上一主题 下一主题

网页抽取正则问题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2010-12-21 12:51 |只看该作者
本帖最后由 黑色阳光_cu 于 2010-12-21 12:53 编辑
  1. my $html = "<table><tr><td>aa</td><td>bb</td></tr></table>标记1<table><tr><td>cc</td><td>dd</td></tr></table>标记2<table><tr><td>ee</td><td>ff</td></tr></table>";
  2. my @ar = $html =~ m{\G(?(?=^).*?标记1).*?(<td>\w+</td>)(?=.*?标记2)}xg;
  3. warn "@ar";
复制代码
哥不喜欢 (??{})

论坛徽章:
0
22 [报告]
发表于 2010-12-21 13:39 |只看该作者
谁再给解释下11楼的写法,google了半天没有答案。

论坛徽章:
0
23 [报告]
发表于 2010-12-21 15:02 |只看该作者
回复 21# 黑色阳光_cu


    谢谢黑色阳光,这个正则很强大,就是我想要的正则。

论坛徽章:
0
24 [报告]
发表于 2010-12-22 09:11 |只看该作者
11楼的原理是巧妙的让正则表达式失败,并不断重新尝试。
当正则表达式引擎在字符串中找到符合下面这段正则规制的内容后
  1. /标记1.*?(<td>\w+<\/td>).*?标记2
复制代码
接下来就是把$1内容存入数组,然后这时候让正则表达式匹配失败。
那么正则表达式引擎就会进行新的尝试。
这样就能匹配到所有的符合条件的内容。

论坛徽章:
0
25 [报告]
发表于 2010-12-22 09:13 |只看该作者
不过11楼的代码写得很隐晦。下面的正则,同样的道理。至于11楼用上/g,这个完全没有必要。
  1. $html =~ /标记1.*?(<td>\w+<\/td>).*?标记2(?{print "$1\n"})(?!)/;
  2. $html =~ /标记1.*?(<td>\w+<\/td>).*?标记2(?{print "$1\n"})\1/;
复制代码

论坛徽章:
0
26 [报告]
发表于 2010-12-22 09:42 |只看该作者
不过11楼的代码写得很隐晦。下面的正则,同样的道理。至于11楼用上/g,这个完全没有必要。
toniz 发表于 2010-12-22 09:13



   


都没有哥的强大

论坛徽章:
0
27 [报告]
发表于 2010-12-22 09:51 |只看该作者
能够写出11楼那样的正则,证明对正则表达式内部工作原理很了解。他那个正则的效率要比你的高太多。

论坛徽章:
0
28 [报告]
发表于 2010-12-22 09:53 |只看该作者
能够写出11楼那样的正则,证明对正则表达式内部工作原理很了解。他那个正则的效率要比你的高太多。
toniz 发表于 2010-12-22 09:51



   
哥不用(?{...})

论坛徽章:
0
29 [报告]
发表于 2010-12-22 09:57 |只看该作者
只讨论正则,不考虑实际应用。如果实际应该的话,我宁可去用楼主的两个正则来实现。

论坛徽章:
0
30 [报告]
发表于 2010-12-22 10:03 |只看该作者
本帖最后由 黑色阳光_cu 于 2010-12-22 10:05 编辑
  1. #!/bin/env perl
  2. # t2.pl

  3. use strict;
  4. use warnings;

  5. foreach (1 .. 200000)
  6. {
  7.         my $html = "<table><tr><td>aa</td><td>bb< /td></tr></table>标记1<table><tr><td>cc</td><td>dd< /td></tr></table>标记2<table><tr><td>ee</td><td>ff</td></tr></table>";
  8.         #my @ar = $html =~ m{\G(?(?=^).*?标记1).*?(<td>\w+</td>)(?=.*?标记2)}xg;
  9.         my @a;
  10.         $html =~ /标记1.*?(<td>\w+<\/td>).*?标记2(??{push @a,$1})/g;
  11. }
复制代码
$ time perl t2.pl

real    0m3.778s
user    0m0.015s
sys     0m0.015s


-------------------------------------------------- 我是华丽的分界线 -----------------------------------------------------------
  1. #!/bin/env perl
  2. # t.pl

  3. use strict;
  4. use warnings;

  5. foreach (1 .. 200000)
  6. {
  7.         my $html = "<table><tr><td>aa</td><td>bb< /td></tr></table>标记1<table><tr><td>cc</td><td>dd< /td></tr></table>标记2<table><tr><td>ee</td><td>ff</td></tr></table>";
  8.         my @ar = $html =~ m{\G(?(?=^).*?标记1).*?(<td>\w+</td>)(?=.*?标记2)}xg;
  9.         #my @a;
  10.         #$html =~ /标记1.*?(<td>\w+<\/td>).*?标记2(??{push @a,$1})/g;
  11. }
复制代码
$ time perl t.pl

real    0m1.271s
user    0m0.031s
sys     0m0.015s
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP