python爬虫入门05 | 不会正则表达式你睡得着觉?有点出息没有?

现在

你已经会使用 python 模拟浏览器

进行一些 Http 的请求了

那么请求完之后

服务器返回给我们一堆源代码

我们可不是啥都要的啊

我们是有原则的

《python爬虫入门05 | 不会正则表达式你睡得着觉?有点出息没有?》 image.png

我们想要的东西

怎么能一股脑的啥都往自己兜里塞呢?

使不得

使不得

所以

在服务器返回给我们的源码之中

我们要过滤

拿到我们想要的就好

其它就丢一旁

那么

我们就需要学会怎么使用

正则表达式

通过它

我们才能过滤出我们想要的内容

其实

正则表达式不仅仅适用于 python

很多编程语言

很多地方都会使用到正则

试想一下

如何从下面这段字符串中快速检索所有的数字出来呢?

zui12shu234ai45der6en7sh88ixia7898os0huaib

《python爬虫入门05 | 不会正则表达式你睡得着觉?有点出息没有?》 image

简单来说

正则表达式就是定义一些特殊的符号

来匹配不同的字符

比如

\d

就可以代表

一个数字,等价于 0-9 的任意一个

那么你肯定想知道

其它的特殊符号表示的啥意思吧?

就不告诉你

《python爬虫入门05 | 不会正则表达式你睡得着觉?有点出息没有?》 image

本篇完

再见

Python学习交流群:556370268,这里有资源共享,技术解答,还有小编从最基础的Python资料到项目实战的学习资料都有整理,希望能帮助你更了解python,学习python。

《python爬虫入门05 | 不会正则表达式你睡得着觉?有点出息没有?》 image

这是各种符号的解释

《python爬虫入门05 | 不会正则表达式你睡得着觉?有点出息没有?》 image
《python爬虫入门05 | 不会正则表达式你睡得着觉?有点出息没有?》 image

《python爬虫入门05 | 不会正则表达式你睡得着觉?有点出息没有?》 image

你能看到这里

也是

《python爬虫入门05 | 不会正则表达式你睡得着觉?有点出息没有?》 image

不知道你看懵逼了没?

反正我是不想看了

接下来

才是干货

《python爬虫入门05 | 不会正则表达式你睡得着觉?有点出息没有?》 image

小帅b就给你精简一下

通俗的把最常用的匹配告诉你

《python爬虫入门05 | 不会正则表达式你睡得着觉?有点出息没有?》 image

ok

知道了这些之后

我们怎么用 python 来进行判断呢?

那就要使用到 python 的库了

它就是

re

接下来我们就来使用 re 模块

对其常用的方法

来使用正则表达式

re.match

使用这个方法

主要传入两个参数

第一个就是我们的匹配规则

第二个就是需要被过滤的内容

例如

我们想要从这
Xiaoshuaib has 100 bananas

拿到一个数字

那么我们就可以这样

import re
content = 'Xiaoshuaib has 100 bananas'
res = re.match('^Xi.*(\d+)\s.*s/pre>,content)
print(res.group(1))

通过我们刚刚说的匹配符号

可以定义出相应的匹配规则

在这里我们将我们需要的目标内容用 () 括起来

此刻我们获得结果是

0

那么如果我们想要 100 这个数字呢?

可以这样

>import re
content = 'Xiaoshuaib has 100 bananas'
res = re.match('^Xi.*?(\d+)\s.*s/pre>,content)
print(res.group(1))

看出区别了么

第二段代码我们多了一个 ?符号

在这里呢

涉及到两个概念

一个是

贪婪匹配

另一个是

非贪婪匹配

所谓贪婪匹配

就是我们的第一段代码

一个数一个数都要去匹配

而非贪婪呢

我们是直接把 100 给匹配出来了

《python爬虫入门05 | 不会正则表达式你睡得着觉?有点出息没有?》 image

刚刚我们用到的

.*

是我们在匹配过程中最常使用到的

表示的就是匹配任意字符

但是

.*?的 . 代表所有的单个字符,除了 \n \r

如果我们的字符串有换行了

怎么办呢?

比如这样

content = """Xiaoshuaib has 100 
bananas"""

那么我们就需要用到 re 的匹配模式了

说来也简单

直接用 re.S 就可以了

import re
content = """Xiaoshuaib has 100 
bananas"""
res = re.match('^Xi.*?(\d+)\s.*s/pre>,content,re.S)
print(res.group(1))

可能有些朋友会觉得

匹配一个东西还要写开头结尾

有点麻烦

那么就可以使用 re 的另一个方法了

re.search

它会直接去扫描字符串

然后把匹配成功的第一个结果的返回给你

import re
content = """Xiaoshuaib has 100 
bananas"""
res = re.search('Xi.*?(\d+)\s.*s',content,re.S)
print(res.group(1))

这样子也是可以获取 100 的

但是如果我们的内容是这样的

content = """Xiaoshuaib has 100 bananas;
Xiaoshuaib has 100 bananas;
Xiaoshuaib has 100 bananas;
Xiaoshuaib has 100 bananas;"""

想要获取所有的 100 呢?

这时候就要用到 re 的另一个方法了

re.findall

通过它我们就能轻松的获取所有匹配的内容了

import re
content = """Xiaoshuaib has 100 bananas;
Xiaoshuaib has 100 bananas;
Xiaoshuaib has 100 bananas;
Xiaoshuaib has 100 bananas;"""
res = re.findall('Xi.*?(\d+)\s.*?s;',content,re.S)
print(res)

这里的结果是

[‘100’, ‘100’, ‘100’, ‘100’]

《python爬虫入门05 | 不会正则表达式你睡得着觉?有点出息没有?》 image

又有朋友觉得

如果我们想直接替换匹配的内容呢

就比如刚刚的字符串

可不可以把 100 直接替换成 250 呢?

《python爬虫入门05 | 不会正则表达式你睡得着觉?有点出息没有?》 image

那就要用到 re 的另一个方法了

re.sub

可以这样

import re
content = """Xiaoshuaib has 100 bananas;
Xiaoshuaib has 100 bananas;
Xiaoshuaib has 100 bananas;
Xiaoshuaib has 100 bananas;"""
content = re.sub('\d+','250',content)
print(content)

那么结果就变成了

Xiaoshuaib has 250 bananas;

Xiaoshuaib has 250 bananas;

Xiaoshuaib has 250 bananas;

Xiaoshuaib has 250 bananas;

250 个香蕉

吃….得完么??

《python爬虫入门05 | 不会正则表达式你睡得着觉?有点出息没有?》 image

再来说说 re 的另一个常用到的方法吧

re.compile

这个主要就是把我们的匹配符封装一下

import re
content = "Xiaoshuaib has 100 bananas"
pattern = re.compile('Xi.*?(\d+)\s.*s',re.S)
res = re.match(pattern,content)
print(res.group(1))

其实和我们之前写的一样的

res = re.match(‘^Xi.?(\d+)\s.s/pre>,content,re.S)

只不过 compile 一下

便于以后复用

好了

关于 re 模块和正则表达式就介绍完啦

知道了怎么请求数据

也知道了将返回的数据如何正则过滤

那么

爬虫对我们来说还难么?

《python爬虫入门05 | 不会正则表达式你睡得着觉?有点出息没有?》 image

这次本篇真的完啦

Python学习交流群:556370268,这里有资源共享,技术解答,还有小编从最基础的Python资料到项目实战的学习资料都有整理,希望能帮助你更了解python,学习python。

《python爬虫入门05 | 不会正则表达式你睡得着觉?有点出息没有?》

    原文作者:学好Python吧
    原文地址: https://www.jianshu.com/p/f31e86f1cf27
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞