返回信息流利用正则表达式匹配类似http://sports.sina.com.cn/g/laliga/2015-05-18/06137610928.shtml的url
正则表达式匹配如下:
news_url_pattern = re.compile('http://.*\.sina\.com\.cn/\w+/\w+/\d{4}-\d{2}-\d{2}/\d*\.shtml')
url_list = re.findall(news_url_pattern,text)
匹配出的结果有个错误:
http://sports.sina.com.cn/" target="_blank">体育</a>】<a onclick="try{if(window._S_uaTrack){_S_uaTrack('enttoprecomm', 'click2');}}catch(e){}" target="_blank" href="http://sports.sina.com.cn/g/premierleague/">杰拉德主场流泪告别</a> <a onclick="try{if(window._S_uaTrack){_S_uaTrack('enttoprecomm', 'click2');}}catch(e){}" target="_blank" href="http://sports.sina.com.cn/g/pl/2015-05-17/03017609732.shtml
感觉应该是正则表达式错了,怎么改才可以呢,求高手。
这是一条镜像帖。来源:北邮人论坛 / python / #6990同步于 2015/5/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
[问题]新手:正则表达式匹配url(已解决)
maoxian
2015/5/19镜像同步16 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
限定一下*.sina.com.cn中*的长度
比如re.compile('http://.{1,10}\.sina\.com\.cn/\w+/\w+/\d{4}-\d{2}-\d{2}/\d*\.shtml')
这种事最好还是先把html parse后再在遍历每个节点时用正则,这样就不会匹配出跨节点的结果;或者用用现成的CSS selector之类的东西。html本来就是有结构的。如果这么直接在一个大长字符串里用一个有好几个{x, m}/+/*的正则,正则表达式引擎得跑断腿了,还易出错
news_url_pattern = re.compile('http://.*\.sina\.com\.cn/\w+?/\w+?/\d{4}-\d{2}-\d{2}/\d*?\.shtml')
试试?
【 在 simpleon 的大作中提到: 】
: 限定一下*.sina.com.cn中*的长度
: 比如[code=py]
: re.compile('http://.{1,10}\.sina\.com\.cn/\w+/\w+/\d{4}-\d{2}-\d{2}/\d*\.shtml')
: ...................
谢谢,写着玩拿来练手的,想试试正则表达式。
3L说的对呃,看结果明显是
http://后面的 .* 匹配了过长的区间,
一般正则表达式默认都是匹配越长越好(贪婪向)
像3L说,加个长度限制,或者使用 .*? 懒惰模式来匹配,懒惰模式仍然可能会有问题。
参考:http://deerchao.net/tutorials/regex/regex.htm,贪婪与懒惰节
不过总结来说尽量别用.*,最好给出更清晰的间隔说明,比如用\w+代替