烦人的正则表达式(六)

运用正则表达式提取文本替换文本的应用场景非常多,如果不想多绕弯路,就需要多多了解一下正则表达式了。

我觉得前面学习了这么多正则表达式的规则,到现在语法应该掌握的差不多了,需要的是多多练习。

提取网页信息

一个网页总是包含许多标签,这些标签方便程序员把不同的内容归类,我们也可以根据这些规则写相应的正则表达式进行匹配提取。

举个例子,我获取了一个网页源代码,里面各种信息应有尽有,我想在最短时间内得到我想要的信息。我觉得网站引用的图片非常好看,我就需要提取图片的链接。对着少则上百多则上千的代码,使用工具无疑是个不错的选择。
目标网站:www.baidu.com
观察其图片链接的格式一般为:

<img class='XXX' XXX >  

先根据这规则编写正则表达式:

/^<img class=.*>$/  

这语句应该很容易能看懂(不懂的应该把我前面写的系列文章再稍稍复习一下)。然后把这语句规则写入方法里。
我用python3演示一下:

import urllib.request as ur  
import re  
s = ur.urlopen("http://www.baidu.com")  
content = s.read()  
result=re.finditer(b'<img class=.*>',content,re.S)  
for match in result:  
    print (match.group())     

好棒啊,能抓取到东西了,但仔细一看,怎么获取到满屏的代码…似乎抓到一个 就行了。理论上获取到的第一个 > 就可以与前面闭合上了,但这里给匹配上了网页源代码中的最后一个 >

怎么解决这种情况呢,匹配到一次就给返回。这里要介绍新知识了,像我们想要的匹配成功一次就返回的匹配模式称为非贪婪模式,而一直匹配到最后一个再停止的模式称为贪婪模式。
设置起来也很简单:

import urllib.request as ur  
import re  
s = ur.urlopen("http://www.baidu.com")  
content = s.read()  
result=re.finditer(b'<img class=.*?>',content,re.S)  
for match in result:  
    print (match.group())

可能一眼很难看出来改了哪里,我只在*后面加了?,然后就能达到我想要的效果。

关于贪婪与非贪婪

这也是正则表达式中常用的点,但我之前忘记讲了,现在讲我也没多少精力(偷懒)。所以我引用网上的详细的教程(侵删):
https://blog.csdn.net/lxcnn/article/details/4756030

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据