正则表达式
Posted chenprice
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式相关的知识,希望对你有一定的参考价值。
#最近简单学习了爬虫的基础,看到了正则表达式的一点用法,写在这里记录一下。
很有趣的一句话:如果一个问题可以用正则表达式解决,那么现在就有两个问题了
在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‘ddd‘,‘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之间的任意一个数
我们可能想到使用ddd来匹配,这可以用来匹配三位数 print(re.search(r‘ddd‘,‘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])
以上是关于正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性