一、单字符匹配规则
正则
import re
1.匹配某个字符串
text = "hello"
ret = re.match('he',text)
print(ret.group())
输出:
he
只会匹配text开头的字符
text = "ahello"
ret = re.match('he',text)
print(ret.group())
报错'NoneType' object has no attribute 'group'
因为text开头没有与he对应的字符串
2。‘.’匹配任意的字符
text = "ahello"
ret = re.match('.',text)
print(ret.group())
输出:
a
text = "\nhello"
ret = re.match('.',text)
print(ret.group())
报错AttributeError: 'NoneType' object has no attribute 'group'
.不会匹配换行符外(/n)
text = "\thello"
ret = re.match('.',text)
print(ret.group())
这里会输出一个缩进(\t)
3.\d匹配任意数字(0-9)
text = "8566hello"
ret = re.match('\d\d\d\d',text)
print(ret.group())
输出:
8566
\d可以匹配到数字,如果匹配到的不是数字会报错,AttributeError: 'NoneType' object has no attribute 'group'
4. \D:匹配任意的非数字
text = "8566hello"
ret = re.match('\D',text)
print(ret.group())
报错:AttributeError: 'NoneType' object has no attribute 'group'
text = "hello"
ret = re.match('\D',text)
print(ret.group())
输出:h
5. \s:匹配空白字符(\n,\t,\r,空格)
text = " aaa"
ret = re.match('\s',text)
print(ret.group())
输出:' ',左边就是一个空格
text = "\naaa"
ret = re.match('\s',text)
print(ret.group())
输出一个回车
6 \w : 匹配数字,a-z以及A-Z和下划线
text = "\naaa"
ret = re.match('\w',text)
print(ret.group())
输出:AttributeError: 'NoneType' object has no attribute 'group'
text = "aaa"
ret = re.match('\w',text)
print(ret.group())
输出:
a
text = "Aaa"
ret = re.match('\w',text)
print(ret.group())
输出:
A
text = "_aaa"
ret = re.match('\w',text)
print(ret.group())
输出:
_
text = "#aaa"
ret = re.match('\w',text)
print(ret.group())
报错AttributeError: 'NoneType' object has no attribute 'group'
7 \W与\w匹配的字符互补(\w能匹配到的,\W匹配不到;\W匹配到的,\w匹配不到)
8. [组合的方式,只要满足[]里面的字符,就可以匹配]
text = "1282-8228673360"
ret = re.match('[\d\-]',text)#意思是匹配一个数字或者减号,因为减号是关键字,所以加一个\给他转义
print(ret.group())
输出:
1
text = "1282-8228673360"
ret = re.match('[\d\-]+',text)#意思是匹配一个数字或者减号,因为减号是关键字,所以加一个\给他转义
后面加一个加号,意思是匹配一个或多个[\d\-]
print(ret.group())
输出
1282-8228673360
text = "1282-822 8673360"
ret = re.match('[\d\-]+',text)
print(ret.group())
输出:
1282-822
1282-822 8673360匹配到空格时(也就是不符合[\d\-]时,停止匹配)
text = " "
ret = re.match('[\d\-]+',text)
print(ret.group())
报错AttributeError: 'NoneType' object has no attribute 'group'
因为+号是匹配一个或多个,这里它一个都匹配不到,所以报错
使用[]的形式代替\d
text = "09"
ret = re.match('[0-9]+',text)
print(ret.group())
输出:
09
使用[]的形式代替\D
text = "02"
ret = re.match('[^0-9]+',text)
print(ret.group())
报错AttributeError: 'NoneType' object has no attribute 'group'
[^0-9]意思是匹配 ‘非0-9的字符’
使用[]的形式代替\w,也就是 [a-zA-Z_]
使用[]的形式代替\W,也就是 [^a-zA-Z_]
二、匹配多个字符
import re
1. *可以匹配任意多个字符
text = "0731"
ret = re.match("\d*",text)
print(ret.group())
输出:
0731
text = " "
ret = re.match("\d*",text)
print(ret.group())
输出: '',左边什么都没有,也没有报错
2. +匹配一个或多个字符
text = "123"
ret = re.match("\d+",text)
print(ret.group())
输出:
123
如果text = " ",会因为一个都没匹配到而报错,在(一、)里面有例子。
3. ? 匹配一个或者0个(要么没有,要么只有一个)
text = "123"
ret = re.match("\d?",text)
print(ret.group())
输出:1
text = " "
ret = re.match("\d?",text)
print(ret.group())
什么都没输出。
4 {m} 匹配m个字符
text = "abcd"
ret = re.match('\w{2}',text)
print(ret.group())
输出:
ab
text = "abcd"
ret = re.match('\w{1,5}',text)#匹配 [1,5]区间个字符,如果text="acbdf",输出acbdf,如果 text="a",输出 a。尽可能多的匹配。
print(ret.group())
输出abcd
三、常用匹配小案例
import re
1、验证手机号码
text = "18337803780"
ret = re.match('1[345678]\d{9}',text)
print(ret.group())
输出:
18337803780
text = "[email protected]"
ret = re.match('\w+@[a-z0-9]+\.[a-z]+',text)
print(ret.group())
输出:
hynever12_@qq.com
text = "[email protected]"
ret = re.match('\w+@[a-z0-9]+\.[a-z]+',text)
print(ret.group())
输出
hynever12_@163.com
#2
验证URL
text = "https://www.baidu.com/s?ie=UTF-8&wd=python"
ret = re.match('(http|https|fts)://[^\s]+',text)
print(ret.group())
输出
https://www.baidu.com/s?ie=UTF-8&wd=python
#3
#验证身份证
text = "410223200402125511"
ret = re.match('\d{17}[\dxX]',text)
print(ret.group())
#输出
#410223200402125511
四、开始结束和或语法
import re
1. 起始号
text = "sgdfahgs"
ret = re.search('^s',text)#意味着text必须以s符号开头
print(ret.group())
输出:
s
2 $ 结尾号
text = "[email protected]"
ret = re.match('\[email protected]$',text)#意味着text必须以s符号开头,这里用match是多余的,因为match本来就是从开头开始匹配的。
print(ret.group())
输出:
neveraa@163.com
text = "[email protected]"
ret = re.match('\[email protected]$',text)#意味着text必须以s符号开头,这里用match是多余的,因为match本来就是从开头开始匹配的。
print(ret.group())
输出:报错AttributeError: 'NoneType' object has no attribute 'group'
3. 贪婪模式与非贪婪模式
text = "1234567"
ret = re.match('\d+',text)#贪婪模式(尽可能多的匹配)
print(ret.group())
输出
1234567
text = "1234567"
ret = re.match('\d+?',text)#贪婪模式(尽可能少的匹配),+号匹配1个或者多个,所以这里的非贪婪模式匹配一个
print(ret.group())
输出
1
text = "1234567"
ret = re.match('\d{4}',text)#{m} 没有此模式
print(ret.group())
text = "标题 "
ret = re.match('<.+>',text)#贪婪模式
print(ret.group())
输出:
<hl>标题</hl>
text = "标题 "
ret = re.match('<.+?>',text)#非贪婪模式
print(ret.group())
输出:
<hl>
4. 匹配1-100数字
可以出现的数字 1,2,3 …… 10,……,99,100
不可以出现的 01,099等
text = "100"
ret = re.match('[1-9]\d?$|100$',text)
print(ret.group())
五、group分组
import re
text = "apple's price $99,orange's price is $10"
ret = re.search('.*(\$\d+).*(\$\d+)',text)
print(ret.group())
print(ret.group(0))
print(ret.group(1))
print(ret.group(2))
print(ret.groups())
输出:
apple's price $99,orange's price is $10
apple's price $99,orange's price is $10
$99
$10
('$99', '$10')
六、findall() 与sub()
import re
findall函数
text = "apple's price $99,orange's price is $10"
ret = re.findall('\$\d+',text)
print(ret)
输出:
['$99', '$10']
sub函数
text = "apple's price $99,orange's price is $10"
ret = re.sub('\$\d+',"0",text)
print(ret)
输出:
apple's price 0,orange's price is 0
html = """
项目背景:今日头条,介意慎投
职位描述:
1、负责教育中台服务端的算法与工程的设计和研发工作;
2、运用工程及算法能力实现教育领域的产品落地
3、主要实现语言为Python / Golang。
职位要求:
1、大学本科(统招)及以上学历,计算机、通信等相关专业;
2、有扎实的编程能力,掌握Python,Golang,Java,C++等任意一种后端编程语言
3、深刻理解计算机原理,有良好的数据结构和算法基础,能够通过算法解决效率问题
4、熟悉Mysql、Memcache、Redis、消息队列等常用WEB组件;
5、有较好的产品意识优先;
6、积极乐观,责任心强,工作认真细致,具有良好的团队沟通与协作能力;
"""
ret = re.sub('<.+?>','',html)
print(ret)
输出:
项目背景:今日头条,介意慎投
职位描述:
1、负责教育中台服务端的算法与工程的设计和研发工作;
2、运用工程及算法能力实现教育领域的产品落地
3、主要实现语言为Python / Golang。
职位要求:
1、大学本科(统招)及以上学历,计算机、通信等相关专业;
2、有扎实的编程能力,掌握Python,Golang,Java,C++等任意一种后端编程语言
3、深刻理解计算机原理,有良好的数据结构和算法基础,能够通过算法解决效率问题
4、熟悉Mysql、Memcache、Redis、消息队列等常用WEB组件;
5、有较好的产品意识优先;
6、积极乐观,责任心强,工作认真细致,具有良好的团队沟通与协作能力;