正则表达式
'''
正则表达式就是使用字符、转义字符、和特殊字符等组成的一个规则
使用这个规则去对文本内容进行搜索、匹配和替换等功能
正则表达式的组成
普通字符: 大小写字符、数字、符合等
转义字符: \w \W \d \D \s \S
特殊字符: . * ? + {} [] ()
匹配模式: I U ...
'''
# 使用正则表达式进行匹配的基本语法
import re
# 定义要匹配的字符串
varstr = 'iloveyou521to123si4567mida'
# 定义规则 正则表达式
reg = '521' # 输出:['521']
reg = '\d\d\d' # \d 是转义字符 代表单个的数字 # 输出:['4567']
# 调用正则表达式相关函数
# re.findall函数,按照正则表达式的规则去字符串中进行搜索匹配所有符合规则的元素,结果返回一个列表,如果没有找到,则返回空列表
res = re.findall(reg,varstr)
print(res)
re正则模块的相关函数
'''
re.match() 函数
从头开始匹配,如果第一个就符合要求,那么匹配成功,
如果第一个不符合规则,返回None
匹配成功后返回Match对象,
成功后可以使用group()和span()方法获取数据和下标区间
re.search() 函数
从字符串的开头开始进行搜索式的匹配
匹配成功则返回Match对象,匹配失败则返回None
成功后可以使用group()和span()方法获取数据和下标区间
search和match方法的区别?
'''
re.match()函数
import re
varstr = 'iloveyou521to123si4567mida'
reg1 ='love'
reg2 ='ilove'
res1 = re.match(reg1,varstr) # 输出 None
res2 = re.match(reg2,varstr) # 输出 <re.Match object; span=(0, 5), match='ilove'>
print(res1,res2)
print(res2.group()) # 获取匹配的数据 # 输出:ilove
print(res2.span()) # 获取匹配的数据的下标区间 # 输出:(0, 5)
re.search()函数
import re
varstr = 'iloveyou521to123si4567mida'
reg ='love'
res = re.search(reg,varstr)
print(res)
print(res.group())
print(res.span())
输出结果:
<re.Match object; span=(1, 5), match='love'>
love
(1, 5)
re.finditer()函数
# re.finditer()函数 和findall是一样的搜索匹配规则,但是结果返回由Match对象组成的迭代器
# res = re.finditer(reg,varstr)
print(list(res)) # 输出:[<re.Match object; span=(1, 5), match='love'>]
for i in res:
print(i.group())
print(list(res)) # 迭代器是取出一个少一个,所以这个会输出一个空列表[]
输出结果:
love
[]
re.sub(pattern,repl,string) 搜索替换
'''
按照正则表达式的规则去搜索匹配要替换的字符串,完成字符串的替换
pattern 正则表达式的规则,匹配需要被替换的字符
repl: 替换后的字符
string: 原始字符串
'''
varstr = 'iloveyou521to123si4567mida'
reg ='love'
res = re.sub(reg,'live',varstr)
print(res)
输出结果:
iliveyou521to123si4567mida
re.split() 函数
re.split() 按照指定的正则规则,进行数据切割
varstr = 'hello my name is Amanda'
res = re.split(' ',varstr)
print(res)
# 输出结果:['hello', 'my', 'name', 'is', 'Amanda']
varstr = 'hello1my2name3is4Amanda'
res = re.split('\d',varstr)
print(res)
# 输出结果:
['hello', 'my', 'name', 'is', 'Amanda']
compile()函数
# compile() 可以直接将正则表达式定义为 正则对象,使用正则对象直接操作
# 普通方法:
arr = [
'i love 123 you',
'i love 234 you',
'i love 456 you',
'i love 789 you',
]
for i in arr:
reg = '\d{3}'
res = re.search(reg,i)
print(res.group())
# compile()方法:
reg = re.compile('\d{3}')
for i in arr:
res = reg.search(i).group()
print(res)
输出结果:
123
234
456
789
正则表达式的规则
'''
普通字符串: 大小写字母、数字、符号。。。
转义字符: \w \W \d \D ...
特殊字符: . * + ? ^ $ () [] {}
模式符号: I U
'''
'''
# 转义字符
reg = '\w' # 代表 单个 字母、数字、下划线
reg = '\W' # 代表 单个 非 字母、数字、下划线
reg = '\d' # 代表 单个的 数字
reg = '\D' # 代表 单个的 非数字
reg = '\s' # 代表 单个的 空白符或者制表符
reg = '\S' # 代表 单个的 非 空白符或者制表符
reg = '\w\w\w\d\d' # 转义字符的组合使用
# 特殊字符(元字符) . * + ? {} [] () ^ $
'''
'''
varstr = '_AAAalove123 @ _2ial2345oveyou'
reg = '.' # . 点 代表 单个的 任意字符,除了换行符之外
reg = 'A*' # * 代表匹配次数 任意次数
reg = '\w+' # + 代表匹配次数 至少匹配一次,匹配到了就走
reg = '\w+?' # 拒绝贪婪,就是前面的匹配规则只要达成即可
reg = '\w*?' # 拒绝贪婪,就是前面的匹配规则只要达成即可,不匹配也算完成任务(0次也算完成任务)
reg = '\w{8}' # {}代表匹配次数,{8}一个数字时,代表必须要匹配的次数
reg = '\w{2,4}' # {2,4} 两个数字时,表示匹配的区间次数,最少是2次,不超过4次
reg = '[a-zA-Z]' # 代表取值的范围 a-zA-Z代表大小写字母 0-9代表数字
reg = '[a-zA-Z0-9_]' # 等同于 \w (0-9代表数字)
reg = '\w{2}(\d{4})\w' # () 代表子组,就是在整个匹配的结果中,再单独提取一份小括号的内容,可以用res.groups()提取出小括号的内容
# varstr = '_AAAalove123 @ _2ial2345oveyou'
# reg = '\w{2}(\d{4})\w'
# res = re.search(reg,varstr)
# print(res) 输出:<re.Match object; span=(18, 25), match='al2345o'>
# print(res.groups()) 输出:('2345',)
'''
# 匹配手机号
# varstr = '17610195211'
# reg = '^1\d{10}$' # ^ 代表开头 $ 代表结尾
# res = re.search(reg,varstr)
# print(res)
# 正则的模式 re.I 代表不区分大小写
varstr = 'iLOVEyou'
reg = '[a-z]{5,10}'
res = re.search(reg,varstr,re.I)
print(res)
定义一个正则表达式来验证邮箱是否正确
'''
定义一个正则表达式来验证邮箱是否正确:
123456@qq.com -- 纯数字
wangwu@qq.com -- 纯字母
wang123@126.com -- 数字加字母
wang_san@163.com -- 混合型
lisi@vip.163.com -- 多级域名
chang@ge.cn -- 企业邮箱(企业域名)
zhang.san@gmail.com -- 含有点的
左边部分
[a-zA-Z0-9]+([_\.][a-zA-Z0-9]+)* # 其中*表示任意次数
右边部分
@(\w+\.)+[a-z]{2,6}
'''
import re
emailarr = [
'123456@qq.com',
'123456@qq.com',
'wangwu@qq.com',
'wang123@126.com',
'lisi@vip.sina.com.cn',
'lisi@vip.sina.com.123cn',
'chang@ge.cn',
'zhang.san@gmail.com'
]
# 注意: 需要验证的是一个完成的字符串是否符合邮箱的规则,因此必须加 限制开始^ 和限制结尾的符号 $
reg = '^[a-zA-Z0-9]+([_\.][a-zA-Z0-9]+)*@(\w+\.)+[a-z]{2,6}$'
for i in emailarr:
res = re.search(reg,i)
if not res:
print('邮箱格式不正确',i)
输出结果:
// An highlighted block
邮箱格式不正确 lisi@vip.sina.com.123cn
完善 手机号码的正则表达式
'''
常规手机号码规则
13[0-9],14[5-9],15[0-3,5-9],16[2,5,6,7,8],17[0-8],18[0-9],19[0-3,5-9]
'''
phonearr = [
'13701383017',
'17610195211',
'177011052021',
]
reg = '^(13[0-9]|14[5-9]|15[0-3,5-9]|16[2,5,6,7,8]|17[0-8]|18[0-9]|19[0-3,5-9])\d{8}$'
for i in phonearr:
res = re.search(reg,i)
if not res:
print('手机号码格式不正确:',i)
输出结果:
手机号码格式不正确: 177011052021
定义一个匹配IP的正则表达式 0-255 255.255.255.254
'''
先匹配 0~199的范围 也就是0或者1开头的
[0,1]?\d{1,2}
在匹配 200-255的范围
第一位是2,那么第二位是0-4,那么第三位就是0-9
第一位是2,那么第二位是5,那么第三位只能是0-5
2([0-4] [0-9]|5[0-5])
'''
iparr = [
'10.11.21.105',
'192.168.1.1',
'192.168.104.111',
'255.118.11.33',
'256.188.12.44',
'0.0.0.0',
'8.8.8.8'
]
# 要作为一个整体来看,而不是拆开来看,因此加上?后必须限制开始^ 和限制结尾的符号 $
reg = '^([0|1]?\d{1,2}|2([0-4][0-9]|5[0-5]))(\.[0,1]?\d{1,2}|2([0-4][0-9]|5[0-5])){3}$'
for i in iparr:
res = re.search(reg,i)
if not res:
print('IP地址不正确',i)
else:
print(res)
# 还有一种规则,验证可行:
reg = '^(([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3}([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])$'
输出结果:
<re.Match object; span=(0, 12), match='10.11.21.105'>
<re.Match object; span=(0, 11), match='192.168.1.1'>
<re.Match object; span=(0, 15), match='192.168.104.111'>
<re.Match object; span=(0, 13), match='255.118.11.33'>
IP地址不正确 256.188.12.44
<re.Match object; span=(0, 7), match='0.0.0.0'>
<re.Match object; span=(0, 7), match='8.8.8.8'>