美文网首页
第五十七课:论一只爬虫的自我修养:正则表达式

第五十七课:论一只爬虫的自我修养:正则表达式

作者: 无罪的坏人 | 来源:发表于2018-09-07 23:01 被阅读0次

    内容来源于网络,本人只是在此稍作整理,如有涉及版权问题,归小甲鱼官方所有。

    0.请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!

    • re模块
    >>> import re
    >>> re.search(r'FishC', 'I love FishC.com!')
    <re.Match object; span=(7, 12), match='FishC'>
    

    search()方法用于在字符串中搜索正则表达式模式第一次出现的位置,如果找到了,匹配的位置是(7,12)。
    这里需要注意两点:
    1️⃣第一个参数是正则表达式模式,也就是你要描述的搜索规则,需要使用原始字符串来写,这样可以避免很多不必要的麻烦。
    2️⃣找到后返回的范围是以下标0开始的,这跟字符串一样。如果找不到,返回None。


    • 通配符
    >>> re.search(r'.', 'I love FishC.com!')
    <re.Match object; span=(0, 1), match='I'>
    >>> re.search(r'Fish.', 'I love FishC.com!')
    <re.Match object; span=(7, 12), match='FishC'>
    

    点号(.)来表示可以匹配除了换行符之外的任何字符,其他的后面具体介绍。


    • 反斜杠
    >>> re.search(r'\.', 'I love FishC.com!')
    <re.Match object; span=(12, 13), match='.'>
    

    反斜杠剥夺元字符(.)的特殊能力。

    >>> re.search(r'\d', 'I love 123 FishC.com!')
    <re.Match object; span=(7, 8), match='1'>
    

    同样,反斜杠也可以使得普通字符拥有特殊能力。


    • 字符类
    >>> re.search(r'[aeiou]', 'I love 123 FishC.com!')
    <re.Match object; span=(3, 4), match='o'>
    

    使用中括号将任何内容包起来就是一个字符类,它的含义是你只要匹配这个字符类中的任何字符,结果就算作匹配。
    注意:默认区分大小写。

    >>> re.search(r'[aeiouAEIOU]', 'I love 123 FishC.com!')
    <re.Match object; span=(0, 1), match='I'>
    >>> re.search(r'[a-z]', 'I love 123 FishC.com!')
    <re.Match object; span=(2, 3), match='l'>
    >>> re.search(r'[0-2][0-5][0-5]', 'I love 123 FishC.com!')
    <re.Match object; span=(7, 10), match='123'>
    

    • 重复匹配
    >>> re.search(r'ab{3}c', 'abbbc')
    <re.Match object; span=(0, 5), match='abbbc'>
    

    用大括号这个元字符来实现重复匹配的功能。

    >>> re.search(r'ab{3}c', 'abbbbbc')
    >>> 
    

    超过3个或者少于3个都不能匹配。

    >>> re.search(r'ab{3,5}c', 'abbbc')
    <re.Match object; span=(0, 5), match='abbbc'>
    >>> re.search(r'ab{3,5}c', 'abbbbc')
    <re.Match object; span=(0, 6), match='abbbbc'>
    >>> re.search(r'ab{3,5}c', 'abbbbbc')
    <re.Match object; span=(0, 7), match='abbbbbc'>
    

    重复的次数也可以取一个范围。
    请问如何用正则表达式匹配0~255这个范围的数??
    有些朋友可能想都不想就会这样写:

    >>> re.search(r'[0-255]','188')
    <_sre.SRE_Match object; span=(0, 1), match='1'>
    >>> re.search(r'[0-2][0-5][0-5]','188')
    >>> 
    

    要注意,[0-255]这个字符类表示0~2还有两个5,所以匹配0125四个数字中任何一个。
    正则表达式应该这样写:

    >>> re.search(r'[0-1]\d\d|2[0-4]\d|25[0-5]', '188')
    <_sre.SRE_Match object; span=(0, 3), match='188'>
    

    分几种情况:

    1.百位可能是0或1,当百位是0或1时,个位和十位任意;
    2.当百位是2时,十位是0-4,个位任意;
    3.当百位是2,十位是5时,个位是0-5;
    下面写一个匹配ip地址的:

    >>> re.search(r'(([0-1]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3}([0-1]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])','192.168.1.1')
    <_sre.SRE_Match object; span=(0, 11), match='192.168.1.1'>
    

    其中{3}表示重复3次;其中小括号表示分组的意思,一个小组就是一个整体。{0,1}表示重复0次(没有)或者1次。


    相关文章

      网友评论

          本文标题:第五十七课:论一只爬虫的自我修养:正则表达式

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