美文网首页大数据 爬虫Python AI SqlPython学习互联网科技
python爬虫入门05 | 不会正则表达式你睡得着觉?有点出息

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

作者: 919b0c54458f | 来源:发表于2019-05-10 21:22 被阅读9次

    现在

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

    进行一些 Http 的请求了

    那么请求完之后

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

    我们可不是啥都要的啊

    我们是有原则的


    image.png

    我们想要的东西

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

    使不得

    使不得

    所以

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

    我们要过滤

    拿到我们想要的就好

    其它就丢一旁

    那么

    我们就需要学会怎么使用

    正则表达式

    通过它

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

    其实

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

    很多编程语言

    很多地方都会使用到正则

    试想一下

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

    zui12shu234ai45der6en7sh88ixia7898os0huaib


    image

    简单来说

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

    来匹配不同的字符

    比如

    \d

    就可以代表

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

    那么你肯定想知道

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

    就不告诉你

    image

    本篇完

    再见

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

    image

    这是各种符号的解释

    image image
    image

    你能看到这里

    也是

    image

    不知道你看懵逼了没?

    反正我是不想看了

    接下来

    才是干货


    image

    小帅b就给你精简一下

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


    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 给匹配出来了


    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']

    image

    又有朋友觉得

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

    就比如刚刚的字符串

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


    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 个香蕉

    吃....得完么??

    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 模块和正则表达式就介绍完啦

    知道了怎么请求数据

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

    那么

    爬虫对我们来说还难么?

    image

    这次本篇真的完啦

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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/nomzoqtx.html