文章目录
- 正则表达式与re模块
- 字符匹配
- 普通字符匹配
- 利用元字符进行模糊匹配
- 元字符: . ^ $ + ? {} [] | () \
- 重复的字符匹配
- re模块下的其他方法
今天总结一下正则表达式,它用来解决模糊匹配的问题,几乎在所有编程语言中都可以用,尤其在python爬虫中,它是一门必修知识;
所谓模糊匹配,就是在匹配字符串中,有一部分是确定的,另一部分是不确定的值但有范围的任意值;
这样我们就可以用一些具有特殊含义的符号,对字符串进行另一种描述,而这些特殊含义的符号就组成一个正则表达式。
正则表达式与re模块
正则表达式也内嵌在Python中,通过re模块来实现,常用方法是findall(),会将匹配到的字符串用一个列表返回
例如: 要匹配一大串字符串中的所有数字,不用for循环和If语句,用re模块一行就能实现
import re
print(re.findall('\d+',"sadfjk11ksk22iuir33bndb44uidu55sgsfir66o77"))
运行结果:
![re模块](https://img-blog.csdnimg.cn/20200311182831424.png)
字符匹配
普通字符匹配
import re
print(re.findall('bigbig',"Iwannaabigbigjuicecanyougiveme?"))
运行结果:
![普通字符匹配](https://img-blog.csdnimg.cn/202003111831478.png)
利用元字符进行模糊匹配
元字符: . ^ $ + ? {} [] | () \
- .任意字符:
import re
print(re.findall('b..g',"abcdefgabcdghijklmn"))
运行结果:
![.任意字符](https://img-blog.csdnimg.cn/20200311183400856.png)
- ^只能为开头:
import re
print(re.findall('^b..g',"bbcgefgabcdghijblmg"))
运行结果:
![^只能为开头](https://img-blog.csdnimg.cn/20200311183519642.png)
- $只能以结尾:
import re
print(re.findall('b..g$',"abcdefgabcdghijblmg"))
运行结果:
![只能以结尾](https://img-blog.csdnimg.cn/2020031118361919.png)
重复的字符匹配
-
贪婪匹配: 即尽量多地匹配,与之相反的是惰性匹配
-
*是0到无穷个:
import re
print(re.findall('Wo23*Le',"sjfkufiWo233333333333333333333Le"))
运行结果:
![0到无穷个](https://img-blog.csdnimg.cn/20200311184509579.png)
- +是1到无穷个:
import re
print(re.findall('Wo23+Le',"sjfkufiWo233333333333333333333Le"))
print(re.findall('Wo23*',"dsjfkjfiWo2"))
print(re.findall('Wo23+',"dsjfkjfiWo2"))
运行结果:
![从1到无穷次](https://img-blog.csdnimg.cn/20200311184759174.png)
- ?匹配0次到1次:
import re
print(re.findall('beii?',"abcdefghibeigggjklmn"))
print(re.findall('beig?',"abcdefghibeigggjklmn"))
运行结果:
![匹配0到1次](https://img-blog.csdnimg.cn/20200311190043575.png)
- {}任意规定次数:
import re
print(re.findall('beig{6}',"abcdefghibeiggggggjklmn"))
运行结果:
![匹配区间](https://img-blog.csdnimg.cn/20200311190207809.png)
- 在后加?变成惰性匹配
以上四个都是贪婪匹配,在 + ? {}后面加一个?就可以变成惰性*匹配(尽可能少地匹配)
import re
print(re.findall('Wo23*',"sjfkufiWo233333333333333333333"))
print(re.findall('Wo23+',"sjfkufiWo233333333333333333333"))
print(re.findall('beig?',"abcdefghibeigggjklmn"))
print(re.findall('Wo23*?',"sjfkufiWo233333333333333333333"))
print(re.findall('Wo23+?',"sjfkufiWo233333333333333333333"))
print(re.findall('beig??',"abcdefghibeigggjklmn"))
print(re.findall('Wo23*?Le',"sjfkufiWo233333333333333333333Le"))
print(re.findall('Wo23+?Le',"sjfkufiWo233333333333333333333Le"))
运行结果:
![变惰性匹配](https://img-blog.csdnimg.cn/20200311190601662.png)
- []选择匹配:
import re
print(re.findall('x[yz]',"iiooxyjiushixzxxoo"))
print(re.findall('x[yz]p',"iiooxypjiushixzpxxoo"))
print(re.findall('q[a*+?]',"iioojq*iusq+hiqaxxoo"))
print(re.findall('q[a-z]','234988436qfsabcdefg386'))
print(re.findall('q[a-z]*','234988436qfabcdefg386'))
print(re.findall('q[0-9]*','ddsljq5201314skdjfinfkd'))
print(re.findall('q[^0-9]',"jkddafkjq123jiuqb"))
运行结果:
![选择匹配](https://img-blog.csdnimg.cn/20200311191027901.png)
- \转义字符:
\跟元字符去除特殊功能,\跟普通字符实现特殊功能
import re
print(re.findall('q\d',"jkddafkjq123jiuqb"))
print(re.findall('\d',"jkjk1jkj3kji1hgh4o52knngygy0pp"))
print(re.findall('\S',"you are my girl"))
print(re.findall('\w',"s&u#n——_shine"))
print(re.findall('I\\b',"may @I# am I from CHINA"))
print(re.findall(r'I\b',"may @I# am I from CHINA"))
运行结果:
![转义字符](https://img-blog.csdnimg.cn/20200311191256349.png)
- |或,()分组:
import re
print(re.findall('qa|you',"jiushiqa|youiushi"))
print(re.findall('(?P<name>[A-z]+)(?P<age>\d+)',"LuFei19Suolong22"))
print(re.search('(?P<name>[A-z]+)(?P<age>\d+)',"LuFei19Suolong22"))
print(re.search('(?P<name>[A-z]+)(?P<age>\d+)',"LuFei19Suolong22").group('age'))
print(re.match('\d+',"1314520jiushi2333333"))
print(re.match('\d+',"1314520jiushi2333333").group())
运行结果:
![或与分组](https://img-blog.csdnimg.cn/20200311191427422.png)
re模块下的其他方法
re模块下的方法,除了findall(),search()、match()还有以下几个常用的
- split()方法:分割字符串
import re
print(re.split('[ |]',"hello python|ok?"))
print(re.split('[mv]',"mtakemvab"))
运行结果:
![split()分割字符串](https://img-blog.csdnimg.cn/2020031119181152.png)
- sub()方法、subn()方法:替换字符串内容
import re
print(re.sub('\d+','Q',"take123away4567it"))
print(re.sub('\d','Q',"take123away4567it"))
print(re.sub('\d','Q',"take123away4567it",4))
print(re.subn('\d','Q',"take123away4567it"))
运行结果:
![sub()替换方法](https://img-blog.csdnimg.cn/20200311191921742.png)
- compile():自定义匹配规则
import re
dig = re.compile('\d+')
print(dig.findall("love18874her15157"))
运行结果:
![自定义匹配规则](https://img-blog.csdnimg.cn/20200311192025268.png)
- finditer():匹配后转换成迭代器
import re
ret = re.finditer('\d+',"love18874her15157Ok88")
print(next(ret).group())
print(next(ret).group())
print(next(ret).group())
运行结果:
![dinditer()匹配后转成迭代器](https://img-blog.csdnimg.cn/20200311192123701.png)
- ()内的?:表示去优先级:
import re
print(re.findall('www\.(?:baidu|sina)\.com',"www.sina.com"))
print(re.findall('(abc)+',"xyzabcabcabcxyzxy"))
print(re.findall('(?:abc)+',"xyzabcabcabcxyzxy"))
print(re.findall('(abc)',"xyzabcabcabcxyzxy"))
print(re.findall('(?:abc)',"xyzabcabcabcxyzxy"))
运行结果:
![?:去优先级](https://img-blog.csdnimg.cn/20200311192226326.png)
到此为止,本篇文章已经总结完了正则表达式与Pythonre模块中的大部分用法。很多细节部分也都有所举例,所以内容比较多,希望读者能慢慢消化。或许你会觉得正则表达式有些太繁琐,但是,当你学到爬虫阶段的时候,就知道正则表达式是多么好用。而且,作为一个程序员,会正则是一项基本技能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)