​ Python爬虫--- 1.4 正则表达式:re库

原文链接:https://www.fkomm.cn/article/2018/7/20/19.html

想要学习爬虫,正则表达式是一定绕不过去的一关。正则表达式是我们在筛选文本数据是经常使用的利器。简单来说,一个正则表达式表达了符合这一规则的一系列的文本。

从“通配符”到正则表达式

玩linux的同学在bash里一定经常用下面这一段代码:

$ rm -rf /*.txt·

这里其实就是一个非常简单的删除当前目录下所有txt文件的命令, *号其实就一个 ‘通配符’。表示任何形式的数据。 从这里我们就可以引出正则表达式的概念:

正则表达式是用来简洁表达一组字符串的表达式,或者你可以将它理解为高级版的 通配符 表达式

  • 举个例子:import re

test = 'python is the best language , pretty good !'

p = re.findall('p+',test)

print(p)

'''

OUT:

'p', 'p'

'''

正则表达式的语法:

来一套言简意赅的图:

来几个正则表达式的栗子:

pic1.jpg

常用的正则表达实例:

**注意一下 :

$ 表示结束匹配**

pic2.jpg

Python的re库的基本使用

re库是Python内置的标准库,所以我们不用安装,直接import re就能直接使用。

re库有着非常强大的功能!学好re库对我们爬虫的编写有极大的帮助!

# re库 采用了 raw string 类型来表示正则表达式,

# 例如:

re1 = r'[1-9]\d{5}'

# 这里的正则表示1一个1~9的数字和5个0~9的数字

# 如:1000 就符合re标准

使用raw string 的好处是 我们不用手动去再次写转义字符了。如果不用raw string 类型, 上面的正则表达式我们就得这么写:

re1 = '[1-9]\\d{5}'

re库的主要功能函数:

我们着重讲一下 re.search这个函数:

'''
re.search(pattern, string, flags=0) 
在一个字符串中搜索匹配正则表达式的第一个位置
返回match对象
∙ pattern : 正则表达式的字符串或原生字符串表示 
∙ string : 待匹配字符串
∙ flags : 正则表达式使用时的控制标记
''' 
str1 = 'hello , world ,life is short ,use Python .WHAT? '
    
a = re.search(r'\w+',str1)
print(a.group())    #  hello

可以看到 我们成功找到了第一个 字符串 “hello”。

  • 常用的第三个参数 flags:re.IGNORECASE:忽略大小写,同 re.I。

re.MULTILINE:多行模式,改变

和$的行为,同

re.M。

re.DOTALL:点任意匹配模式,让’.’可以匹配包括’\n’在内的任字符,同 re.S。

我们来使用一下控制标记试试:

str1 = 'hello , world ,life is short ,use 
b = re.search(r'w.+D',str1,re.I)
print(b.group())
#  world

可以看到r'w.+D' 成功匹配到了world。

我们再来说另一个常用函数re.findall()

'''
re.findall(pattern, string, flags=0) 
搜索字符串,以列表类型返回全部能匹配的子串
∙ pattern : 正则表达式的字符串或原生字符串表示 
∙ string : 待匹配字符串
∙ flags : 正则表达式使用时的控制标记
'''

c = re.findall(r'\w+',str1)
print (c)
#['hello', 'world', 'life', 'is', 'short', 'use', 'Python', 'WHAT']

可以看到,我们找整个字符串中的所有单词,并且以列表类型反回了。

好了,剩下的函数用法基本和上面相似,都很简单的。用的时候稍微看一下参数就可以。我就不一一介绍了。

re库的另一种用法

在前面的例子中,我们都是在调用方法是传入一个原生字符串来表示re表达式,但是在多次搜索符合同一规则的数据时,这样做就会使得效率大大降低。相对应的我们有替代的做法。

str2 = 'hssso'
re1 = re.compile(r'h.{3}o')
print(re1.findall(str1))
print(re1.findall(str2))
# ['hello']
# ['hssso']

这样,先把正则进行编译,在进行查找,就能大量节省时间,增加效率。

关于Match 对象:

match对象是一次匹配的结果,他包含了很多的信息:

'''
match 对象的属性
    
.string : 待匹配的文本 
.re     : 匹配时使用的patter对象(正则表达式)
.pos    : 正则表达式搜索文本的开始位置
.endpos : 正则表达式搜索文本的结束位置   
'''
d = re.search(r'e.+d',str1)
print(d.group()) # ello , world
print (d.string) # hello , world ,life is short ,use Python .WHAT?
print (d.re) # re.compile('e.+d')
print (d.pos) # 0
print (d.endpos) # 48

好了,关于re库,我们暂时就先介绍到这里,

只是介绍了一些浅显的用法,re库还有很多更加高级的用法,

我会在以后的实战里慢慢展现。

说到实战,写简单爬虫的基础咱们已经都掌握了。


相关文章和视频推荐

圆方圆学院汇集 Python + AI 名师,打造精品的 Python + AI 技术课程。 在各大平台都长期有优质免费公开课,欢迎报名收看。

公开课地址:https://ke.qq.com/course/362788?flowToken=1007319

加入python学习讨论群 78486745 ,获取资料,和广大群友一起学习。

原文链接:https://www.fkomm.cn/article/2018/7/20/19.html

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT派

Code | Python30个编程技巧!

1. 原地交换两个数字 Python 提供了一个直观的在一行代码中赋值与交换(变量值)的方法,请参见下面的示例: ? 3. 使用三元操作符来进行条件赋值 三元...

3604
来自专栏GreenLeaves

C# 泛型

1、泛型的优势 在日常开发中,我们经常会开发一些特殊的功能,而这个功能适用于多个类型(比如string,int等多种类型),最简单的做法是给每种类型都做一个实现...

19310
来自专栏程序员互动联盟

java到底和C++有啥区别?

作为一名C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且Java的语法无疑是非常熟悉的。事实上,Java本来就是从C++衍生出来的。 然而,C++和...

3736
来自专栏Petrichor的专栏

eager evaluation (及早求值) & lazy evaluation (惰性求值)

及早求值,也被称为贪婪求值(greedy evaluation)或严格求值,是多数传统编程语言的求值策略。

3073
来自专栏北京马哥教育

鲜为人知的 Python 语法

所有人(好吧,不是所有人)都知道 python 是一门用途广泛、易读、而且容易入门的编程语言。

891
来自专栏java学习

Java每日一练(2017/7/16)

最新通知 ●回复"每日一练"获取以前的题目! ●【新】Ajax知识点视频更新了!(回复【学习视频】获取下载链接) ●答案公布时间:为每期发布题目的第二天 ★【新...

3097
来自专栏维C果糖

史上最简单的 MySQL 教程(十一)「列类型 之 字符串型」

所谓的列类型,其实就是指数据类型,即对数据进行统一的分类,从系统的角度出发是为了能够使用统一的方式进行管理,更好的利用有限的空间。

42010
来自专栏HappenLee的技术杂谈

C++雾中风景2:struct还是class?

在C++语言作为C语言的一个超集,但是并不兼容C语言的所有语法规则的。C语言是我学习的第一门编程语言,相对于对其中的语法规则比较熟悉,C语言之中可以使用stru...

1132
来自专栏ThoughtWorks

Scala中的语言特性是如何实现的?

image.png #思特沃克好声音# (图片:网络) 我们学东西不止要知其然,还要知其所以然。成都办公室的崔鹏飞在学Scala的时候,不止学习如何使用Scal...

3127
来自专栏菜鸟致敬

Python匿名函数快速入门

匿名函数,顾明思义就是一种隐匿了名字的函数。Python中使用lambda语法定义匿名函数,只需用表达式而无需申明。

691

扫码关注云+社区

领取腾讯云代金券