网页中开头的.*贪婪匹配为什么不成功呢

网页中开头的.*贪婪匹配为什么不成功呢

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,这是什么原因啊,我其他语言这么写是匹配到最后一个的
如果把里面的换行符号替换掉,是可以的:search(body.replace('\n', ''),re.I|re.S)

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


QUOTE:
原帖由 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)
>>> import urllib2,re
>>> body = urllib2.urlopen('http://www.baidu.com').read()
>>> links = re.compile("(http:.*?)[ |>]").findall(body)
>>> links # 可以看出是把所有的http开头全部列出来了把

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


QUOTE:
原帖由 jjj137 于 2008-8-28 11:20 发表

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

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




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

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

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

用正则匹配本来就是个耗效率的操作唉。
是不是因为.*不能匹配换行符'\n'阿
是不是因为.*不能匹配换行符'\n'阿
-------
就是那个原因,加了re.S也不行。之前用ruby,.net等都可以匹配到的啊


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

不过那个看上去麻烦点,还是正则来的直接,代码也少,直接匹配。
g=re.search('(?s).*http','aeefehttp\nddddhttp')
这样可以匹配到\n阿