免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4087 | 回复: 14
打印 上一主题 下一主题

网页中开头的.*贪婪匹配为什么不成功呢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-28 10:49 |只看该作者 |倒序浏览
import urllib2

url = 'http://www.baidu.com'
body = urllib2.urlopen( url ).read()
lastLink = re.compile(u'.*http(.*?)>'.encode('gbk')).search(body,re.I|re.S)
print lastLink.group(1)
------------
找网页中最后一个链接,以上是例子代码,
.*http找到的不是最后一个http,这是什么原因啊,我其他语言这么写是匹配到最后一个的

论坛徽章:
0
2 [报告]
发表于 2008-08-28 11:15 |只看该作者
如果把里面的换行符号替换掉,是可以的:search(body.replace('\n', ''),re.I|re.S)

问题是re.S不是让"."匹配换行符了么

论坛徽章:
0
3 [报告]
发表于 2008-08-28 11:20 |只看该作者
原帖由 mattoid 于 2008-8-28 10:49 发表
import urllib2

url = 'http://www.baidu.com'
body = urllib2.urlopen( url ).read()
lastLink = re.compile(u'.*http(.*?)>'.encode('gbk')).search(body,re.I|re.S)
print lastLink.group(1)
------- ...

不太会贪婪匹配,不过加了个结束符就好了……
import urllib2, re

url = 'http://www.baidu.com'
body = urllib2.urlopen( url ).read()
lastLink = re.compile(u'.*http(.*?)>$'.encode('gbk')).search(body,re.I|re.S)
print lastLink.group(1)

论坛徽章:
0
4 [报告]
发表于 2008-08-28 11:26 |只看该作者
>>> import urllib2,re
>>> body = urllib2.urlopen('http://www.baidu.com').read()
>>> links = re.compile("(http:.*?)[ |>]").findall(body)
>>> links # 可以看出是把所有的http开头全部列出来了把

最后一个可以用links[-1]

论坛徽章:
0
5 [报告]
发表于 2008-08-28 11:59 |只看该作者
原帖由 jjj137 于 2008-8-28 11:20 发表

u'.*http(.*?)>$' ...


这样的话'(.*?)>'后面那个>变成匹配文章最末端的>了;用$从末尾处开始匹配的话,找不到像类似http的好tag去定位




谢谢xiaoyu9805119,不过因为要处理海量网页,暂时不考虑全部匹配到结果,然后取数组最后一个,这样影响效率了

论坛徽章:
0
6 [报告]
发表于 2008-08-28 12:58 |只看该作者
海量网页?

是巨大的一个页面?还是若干页面???

如果是巨大的一个页面用什么匹配都没什么效率可言
如果只是若干个页面,这样的效率可以忽略不计了。

用正则匹配本来就是个耗效率的操作唉。

论坛徽章:
0
7 [报告]
发表于 2008-08-28 13:34 |只看该作者
是不是因为.*不能匹配换行符'\n'阿

论坛徽章:
0
8 [报告]
发表于 2008-08-28 13:56 |只看该作者
是不是因为.*不能匹配换行符'\n'阿
-------
就是那个原因,加了re.S也不行。之前用ruby,.net等都可以匹配到的啊


如果只是若干个页面,这样的效率可以忽略不计了。用正则匹配本来就是个耗效率的操作唉。
--------
就是有很多页面,或许要跑很多天的去萃取每一页的信息,所以想正则尽量快了。
不过正则比起dom化html后去萃取应该快吧,比正则效率高的好象有一种新玩意,前阵子做美国比价网的朋友说过,不过搞忘了

论坛徽章:
0
9 [报告]
发表于 2008-08-28 14:12 |只看该作者
你可以试试HTMLParser。就是解析html,可以把里面的按照标签都分出来

不过那个看上去麻烦点,还是正则来的直接,代码也少,直接匹配。

论坛徽章:
0
10 [报告]
发表于 2008-08-28 14:35 |只看该作者

回复 #8 mattoid 的帖子

g=re.search('(?s).*http','aeefehttp\nddddhttp')
这样可以匹配到\n阿
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP