pricechen

导航

正则表达式

  #最近简单学习了爬虫的基础,看到了正则表达式的一点用法,写在这里记录一下。

  很有趣的一句话:如果一个问题可以用正则表达式解决,那么现在就有两个问题了

  在python中正则表达式可以用来按照规则查找字符串,它是用re模块实现的

  1、查找给定字符串

import re
print(re.search(r'chen','pricechen'))

<re.Match object; span=(5, 9), match='chen'>
#span(范围)是按照序列的顺序给定的,match即为匹配的字符串

  2、通配符

  通配符就是(可以匹配除了换行符以外的所有字符)的字符,在python中通配符为"."

print(re.search(r'chen...','pricechen123'))

<re.Match object; span=(5, 12), match='chen123'>
#可以看到这里使用三个"..."匹配了”123“三个字符

print(re.search(r'ri..ch','pricechen'))
<re.Match object; span=(1, 7), match='ricech'>
#这里的".."匹配了字符"ce"

#通配符"."可以匹配一切字符,那么当需要匹配符号"."时应该怎么办,这里使用"\."来匹配
print(re.search(r'\.','pricechen.txt'))
<re.Match object; span=(9, 10), match='.'>

  3、在python中称拥有特殊能力的符号(比如".")为元字符,"\"(反斜杠)可以解除元字符的特殊能力,使其变成普通字符,当然,"\"也可以使得部分普通字符具有特殊能力,比如"\d"

print(re.search(r'\d\d\d','price123chen'))

<re.Match object; span=(5, 8), match='123'>
#三个\d匹配了三个数字,单个\d就会匹配单个数字

  4、字符类匹配,只要字符串中含有待匹配括号中字符,那么就是匹配到了,但是只会匹配第一个字符

print(re.search(r'[1ce]','price123chen'))

<re.Match object; span=(3, 4), match='c'>

#还可以用范围来表示需要查找的字符
print(re.search(r'[3-4]','price3chen'))
<re.Match object; span=(5, 6), match='3'>

#其实这里不写中间的"-"也可以匹配,但是仅限于匹配数字的范围

  5、重复匹配字符

print(re.search(r'e{3}','priceeechen'))

<re.Match object; span=(4, 7), match='eee'>

#还有一种是表示重复匹配次数的范围
print(re.search(r'e{2,3}','priceeechen'))

 <re.Match object; span=(4, 7), match='eee'>

  练习

  1、使用正则表达式来匹配数字0~255之间的任意一个数

我们可能想到使用\d\d\d来匹配,这可以用来匹配三位数
print(re.search(r'\d\d\d','255'))
但是两位数或者一位数字就没办法匹配了
所以,匹配数字范围的方法是:
。。。
。。。
。。。
。。。
划重点
。。。
。。。
"[01]{0,1}\d{0,1}\d|2[04]\d|25[05]"
1、三个或号代表三部分,第一部分"[01]{0,1}\d{0,1}\d"代表筛选0~199,其中"[01]{0,1}"代表第一位数为0或1,重复的次数为0次或一次(即可能出现也可能不出现)。
 "\d{0,1}"代表第二位数字在0~9之间,可能出现也可能不出现,"\d"代表第三位数字也在0~9之间,但是一定会出现。
2、第二部分“2[04]\d“代表200~249,"2"代表三位数2是百位,"[04]"代表十位的数在0~4之间,"\d"代表个位的数在0~之间。
3、第三部分"25[05]"代表230~255,"2"代表百位,"5"代表十位,"\d"代表个位
我们将255这个数分为三部分,才能将这个数完整用正则表达式表达出来。

  2、使用正则表达式表达IP地址192.168.1.1

#首先来看源代码
print
(re.search(r'(([01]{0,1}\d{0,1}\d|2[04]\d|25[05])\.){3}([01]{0,1}\d{0,1}\d|2[04]\d|25[05])','200.255.1.123'))
分析:我们将ip地址分为四个部分(192.)(168.)(1.)(1),其中每个部分都在数字0~255之间,但是前面三个部分都是重复的,所以我们将前面三个部分加一个重复值
   就{3}可以了,但是每个部分不仅仅是数字,还有"."符号,因此每个部分里面加上它,就变成([01]{0,1}\d{0,1}\d|2[04]\d|25[05])\.){3},第四个部分就是0
   到255之间,我们可以直接在后面加上它,并为其添加括号,最终所得到的正则表达式就是:
   (([01]{0,1}\d{0,1}\d|2[04]\d|25[05])\.){3}([01]{0,1}\d{0,1}\d|2[04]\d|25[05])

 

posted on 2018-12-21 22:27  pricechen  阅读(254)  评论(0编辑  收藏  举报