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

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

作者: 无罪的坏人 | 来源:发表于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