前言
继上篇文章说了正则表达式的基础用法,那今天我们就继续说一下正则表达式的复杂的用法。好了,废话不多说,直接进入正题。
正文
情景:当你想要匹配一个qq号,qq号码长度为5-10位,那根据上篇文章的说法,很容易就可以想到该正则:
[0-9]{
5,10}
这样是可以的,但是当你匹配一个长度大于10的号码时就会出错,这时就会去该字符串的前10个数字出来,如下:
import re
a='1234567890'
r=re.findall('[0-9]{5,10}',a)#明显当查找的字符串长度大于8位时就会出错,只会截取前一部分长度
print(r)
结果:
['1234567890']
这样的话你就会得到一个错误的qq号码。
这时就需要引入边界匹配了:
- ^:这个是从左边开始匹配,规定左边的首个字符
- $:这个是从右边开始匹配,规定右边的首个字母
现在再写个匹配qq号码的正则:
r=re.findall('^[0-9]{5,10}$',a)#这个表示从左边起为5-10的数字长度,右边也是一样
print('第一个匹配结果:',r)
a = '1234567890'
r=re.findall('^[0-9]{5,10}$',a)
print('第二个匹配结果:',r)
结果:
第一个匹配结果: []
第二个匹配结果: ['1234567890']
这样就可以匹配到了,是不是很神奇?
组:前面我们有用 [ ] 来匹配,中括号里面表示的是或关系,而这里的组表示的是并关系,并且用小括号括起来 ( )。
比如:重复 python 字样三次
import re
a='pythonpythonpythonjakjpythonpythonsdjjpythonpythonpythonsd'
r=re.findall('(python){3}',a)
print(r)
结果:
['python', 'python']
这里的结果不是返回三个python,而是返回这个组,当符合一次就会将此组添加到返回列表中一次。
这个组还挺好用的,再看下这个需求:获取下列英文中的life和python之间的内容。
a='life is short,i use python'
r=re.findall('life(.*)python',a,re.S)
print(r) # 这样获取的就是组内的内容
结果:
[' is short,i use ']<