python爬虫基础之正则表达式

Python基础前期后后看了五六遍,除了能读懂一些简单的代码,一直也没有进阶。

这次借助一个爬虫教学视频。把学习中的一些重点写下来,一个是自己巩固,一个是也帮助跟自己一样有疑惑的朋友有个更深的理解。

这篇主要讲的是正则

正则字符:

1)^ $ * ? + {3} {3,} {3,6}

2) [] [^] [a-z] .

3) \s \S \w \W

4) [\u4E00-\u9FA5] () \d

这里都以python例子来验证说明

^表示以某个字符开头,比如 ^a,即表示以a开头

.表示任意字符(除\n换行符以为),比如 ^a. 表示以a开头,后面可以带上任意字符

* 表示匹配前一个字符0次或无限次,比如 ^a.* 表示以a开头,后面带一个或者多个任意字符

上面这个例子,字符串是以a开头,后面接任意字符,所以是匹配 ^a.* 这个规则的,所以程序打印出yes。很好理解

$ 以某个字符结尾,比如 5$, 则表示匹配以5结尾的字符串

看上图一目了然,不再做多介绍

有个注意点

如果我们的正则是这样写的 ^a.5$ 则表示的只是共3个字符,以a开头,第二个任意字符,第三个为5即结尾。所以如果没有*的话,上图例子中的匹配都是不成功的。

正则表达式的贪婪模式

比如一个字符串"abaaaaaaabbbbbgseraggts",我想用正则匹配提取baaaaaaab,按我们上面所学,则表达式应该是这么写 .*(b.*.b).*

解释一下表达式

以字符开头+(b+任意字符+b)+任意字符,把我们想截取的,加上括号,python中用group获取。

运行程序我们发现,打印出来的是bb,而并非我们要的baaaaaaab。

这就是因为贪婪模式,可以这么理解,.*这里,正则会尽量多的去匹配字符串"abaaaaaaabbbbbgseraggts",所以他是是找到倒数第二个b才去匹配(b.*b),结果匹配出来的是bb,可以用从右往左反向匹配匹配来理解。

基于上面的贪婪模式,我们可以在正则表达式中改成这样

.*?(b.*.b).* ,即变成非贪婪模式,从左边开始匹配,找到第一个b开始。如果图运行结果

如果直接.*?(b.*.b).*,则出来的结果是baaaaaaabbbbb,因为贪婪模式的原因,他会去匹配尽量多的b

所以正确的表达式是 .*?(b.*.?b).*

+ 与 * 大同小异,不同的一点是,+限定前面一个字符出现的次数至少要一次,而*则没有这个限定,可以是0次,也可以是1次或者多次。

比如正则为b.+b , bab或者baacb都是匹配这个正则的,而bb则不匹配这个正则

但是bb,bab,baacb都是匹配 b.*b 这个正则的。

如下图实例

{3} {3,} {3,6} 这三个就是限定字符出现的次数

{3}表示出现三次

{3,}表示3次或3次以上

{3,6}表示3-6次包括3和6次。

| 可以理解为或

比如 abc |abc123 这个正则,则只要匹配这两个字符串中的一个,则表示匹配成功

[] ,比如[1243],表示中括号中只要有一个匹配则表示匹配

还有一种表示法[0-9]表示0-9之间的任意数字有一个匹配的话就是可以,还有[a-Za-z]都是一样的道理。而[^]在表示取反,例如[^5]则表示除了5以外的所有字符

中括号做常用的是表示电话号码

1[48357][0-9]{9} 1开头,第二位为48357其中一个,后面只能是9为0-9的任意数字

\s 表示空格

\S 表示非空格

\w 可以用与中括号的[A-Za-z0-9_]这之间的任意字符一个意思

\W 是\w的取反

[\u4E00-\u9FA5] 表示汉字

这里有个注意点,因为我用的是python2.7,所以中文要主要编码问题

\d 代表的是数字,这个很简单,不再多讲

正则是一个很重要的知识点,最主要是要懂得搭配使用。

有了正则,在爬虫中就可以精准的爬到我们想要的东西。

原文发布于微信公众号 - 网络安全社区悦信安(yuexin_an)

原文发表时间:2017-08-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

static_cast, dynamic_cast, reinterpret_cast, const_cast区别

(使用vs2010所带的编译器) 转载请注明来源 http://www.cnblogs.com/jerry19880126/

9920
来自专栏用户2442861的专栏

Python之逻辑运算和缩进和选择if

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

8610
来自专栏Java架构师学习

为Java程序员金三银四精心挑选的五十道面试题与答案

1、面向对象的特征有哪些方面? 【基础】 答:面向对象的特征主要有以下几个方面: 1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地...

37660
来自专栏向治洪

模板方法模式

概述 概念:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。模板方法模式属于行为类模式。 模板...

21770
来自专栏轮子工厂

3. C语言 -- 叫你一声你敢答应嘛

\(@^0^@)/ 嗨!大家好,我是呆博~前两天的文章还满意嘛,如果有不满意的地方尽管提,我一定……嗯……能做到的我一定做。今天准备给大家分享第三篇文章,变量与...

14150
来自专栏kevindroid

JNI所需的C语言知识小结

18150
来自专栏数据结构与算法

1470 数列处理

个人博客:doubleq.win 1470 数列处理  时间限制: 1 s  空间限制: 1000 KB  题目等级 : 青铜 Bronze 题解 题目描述 D...

28050
来自专栏决胜机器学习

PHP数据结构(二十) ——其他插入排序

PHP数据结构(二十)——其他插入排序 (原创内容,转载请注明来源,谢谢) 注:本文是衔接直接插入排序的,因此直接插入排序的相关内容请点击——PHP...

37270
来自专栏Android开发指南

6:异常处理

30880
来自专栏编程

机器学习之Python基础(二)

标题 类 面向对象 装饰器 1 类 首先举一个创建类的例子 class是声明类的关键字,human是类名,括号里的object是继承的父类(在Python2中如...

206100

扫码关注云+社区

领取腾讯云代金券