python正则表达式爬虫_Python爬虫之正则表达式

微信公众号开发已经告一段落了,这几天一直在想之后为大家带来什么的呢?因为我不想发一些 Python 基础的文章,我觉的那样是比较浪费时间的,浪费大家的时间,比较基础的语法知识网上都是比较容易找的到,而且写的也是非常的好,所以我觉得之后为大家带来一些 Python 强大的操作,因为想之后写爬虫方面的知识,所以从现在开始就带大家一步一步的走向爬虫世界,今天想和大家分享的是:Python 中的正则表达式。

为什么使用正则表达式?

典型的搜索和替换操作要求您提供与预期的搜索结果匹配的确切文本。虽然这种技术对于对静态文本执行简单搜索和替换任务可能已经足够了,但它缺乏灵活性,若采用这种方法搜索动态文本,即使不是不可能,至少也会变得很困难。

通过使用正则表达式,可以:

· 测试字符串内的模式。

例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。

· 替换文本。

可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。

· 基于模式匹配从字符串中提取子字符串。

可以查找文档内或输入域内特定的文本。

例如,您可能需要搜索整个网站,删除过时的材料,以及替换某些 HTML 格式标记。在这种情况下,可以使用正则表达式来确定在每个文件中是否出现该材料或该 HTML 格式标记。此过程将受影响的文件列表缩小到包含需要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料。最后,可以使用正则表达式来搜索和替换标记。

好了,现在让我们来看看具体的语法

不想看,看不下去,别着急,我们通过实际的例子来了解的!

现在我们每个人基本都是有一个自己的邮箱,比如:fightjiang@qq.com

那么我们如何在一大堆的数据中快速的将它提取出来的呢?根据正则语法,我们可以这样来定义一个pattern:\w+@\w+\.com

为什么要这样来定义的呢?我们需要看看上面的图片了呢!

"\w" 的意思是单词字符[A-Za-z0-9_]。注意是 "单字符串",可以是A-Z或者a-z或者0-9或者其他各国语言中的任意一个。

"+" 匹配前一个字符1次或无限次。那么 "\w+" 组合起来的意思就是匹配一次或无限多次的但字符串[A-Za-z0-9]组合的字符串。

"@" 是邮箱的特定字符,所以固定不变。

第二个 "\w+" 与前一个是一个道理,匹配一次或无限次的[A-Za-z0-9]组合的字符串。

" \. " 的含义是将" . "转义,因为 " . " 本身也是正则语法中的其中一种,为了真的得到 ".com" 而不是带有功能的" . ", 所以在前面加上 "\" 转义字符。

所以,不论是例子中的 fightjiang@qq.com,还是其它如 fightfight@126.com之类的邮箱,只要符合规则全都可以匹配,是不是特别的简单而且快速呢!

那么问题来了,有的邮箱格式可是 fightfight@xxx.xxx.com 这样的!这样的话上面的规则就不能用了。没错,上面的规则比较特殊,只能匹配单一格式的邮箱名。那么怎样设计一个满足以上两种格式的pattern呢?看看这个:\w+@(\w+\.)?\w+\.com

这个又是什么意思?\w+@与之前一样

(\w+\.)?中的“ ? ”是匹配0次或1次括号分组内的匹配内容,"()" 则表示被括内容是一个分组,分组序号从pattern字符串起始往后依次排列。分组的概念非常重要,在后面 “匹配对象方法” 章节会着重介绍其如何使用。

\w+\.com与之前一样

因为是匹配0次或1次,那么就意味着括号内的部分是可有可无的,所以这个pattern就可能匹配两种邮箱格式。

“?”是0次或1次,那么 \w+@(\w+\.)*\w+\.com 模式就更厉害了," * " 可以匹配0次或无限次。

明白了这个之后,相信你应该对正则表达式有一个概念了,但还有很多种语法以及组合方法需要在实践中反复练习。

实践

有些清楚了之后,我们现在就直接来看看在真正的使用中是如何高效的使用的呢,这是 50 行爬去猫眼猫眼TOP 10 中的一段代码,其中就用到了正则表达式,这里我还附上网页解析的图片,方便大家更好的理解其中的强大。我们要爬取的内容分别是:电影名称,图片链接,上映时间,评分! 大家可以看到pattern 里面的正则表达式内容

. 匹配除换行符 \n 之外的任何单字符

*  匹配前面的子表达式零次或多次。

?  匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。

(注释:这里 .是另一个元字符,匹配除了换行符以外的任意字符。*同样是元字符,不过它代表的不是字符,也不是位置,而是数量——它指定 *前边的内容可以连续重复使用任意次以使整个表达式得到匹配。因此 .*连在一起就意味着任意数量的不包含换行的字符。其中 (.*?)是匹配没有 html 标签,只有内容)

相信大家对比两张图片就可以看明白了,看到了这里,已经对正则表达式有一些认识了的吧,对于记表格里的语法最好的方式就是勤加练习,编程是练习出来的,绝不是看就能学会的,一定要动手实践。

另外,我觉得如果一篇文章加入太多内容的话,会显得比较枯燥无味,大家也许不会完整的看不下去,所以我一般会以实践为重点来介绍,可以说是提起兴趣吧,具体的方法百度上有比我写的更好的!

推荐阅读:菜鸟教程,廖雪峰老师的 Python 教程

PS:1、最近比较忙,所以更新会比较慢的呢,我会尽量挤时间出来的,加油!

2、这个公众号现在不给我留言功能,真的是让我头疼,我会尽量想办法解决的,大家有问题的话可以直接私聊我的吧!

PS:如果觉得文章还不错的话,还请大家点赞分享下。算是对「正经的码农」最大的支持!

欢迎关注微信公众号【正经的码农】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值