python 正则表达式

一、单字符匹配规则

正则
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) 输出: 项目背景:今日头条,介意慎投 职位描述:&nbsp; 1、负责教育中台服务端的算法与工程的设计和研发工作;&nbsp; 2、运用工程及算法能力实现教育领域的产品落地&nbsp; 3、主要实现语言为Python / Golang。&nbsp; 职位要求:&nbsp; 1、大学本科(统招)及以上学历,计算机、通信等相关专业;&nbsp; 2、有扎实的编程能力,掌握Python,Golang,Java,C++等任意一种后端编程语言 3、深刻理解计算机原理,有良好的数据结构和算法基础,能够通过算法解决效率问题&nbsp; 4、熟悉Mysql、Memcache、Redis、消息队列等常用WEB组件;&nbsp; 5、有较好的产品意识优先; 6、积极乐观,责任心强,工作认真细致,具有良好的团队沟通与协作能力;

你可能感兴趣的:(正则表达式,python)