'''
正则表达式
regular expression
正则表达式是一种特殊的字符序列,可以理解成就是字符串
只不过这个字符串要比原始字符串强大
正则表达式使用场景:
注册设置密码时 不允许有特殊字符,密码的个数是多少位
爬虫时,使用正则抓取页面中的指定数据
正则表达式的使用原则:
处理字符串的强大工具 有自己的语法一级独立处理引擎
效率不如系统自带,但币自带强大
如系统提供可解决,尽量使用自带
导入模块re
'''
'''
1.match:是否以正则字符串的内容开头 校验是否满足正则对应内容
第一个参数 :正则语法字符串
第二个参数: 要进行校验的字符串
第三个参数: 设置校验过程中的配置属性
'''
1 import re
2
3 #如果返回结果是none 就表示匹配失败
4 #如果是一个match对象 就表示匹配成功
5 res= re.match("啦啦啦",'啦啦啦 哈哈哈 咳咳咳')
6 print(res)#<re.Match object; span=(0, 3), match='啦啦啦'>
7 '''
8 ^x --表示以这个字符串以x开头
9 x$ --表示的是字符串以x结尾
10 '''
11 res= re.match("^啦啦啦$",'啦啦啦 哈哈哈 咳咳咳')
12 print(res)#None
13 #如果返回结果None 表示匹配失败
14 #如果是一个match对象 就表示匹配成功
'''
2.search方法
按照正则规则 在待校验的字符串中 查找是否有指定格式的数据 有的话 返回查找到的第一个match对象
没有的话返回None
正则语句中,表示通配符,能匹配的是除了
之外的任意一个符号
'''
1 pattern = 'c.t' #要找的数据时ct 组合之间有任意一个字符
2 src_str ="lll cat crt"
3 res =re.search(pattern,src_str)
4 print(res)#<re.Match object; span=(4, 7), match='cat'>
5
6 #从match对象中获取匹配到的对象
7 data = res.group()
8 print(data)
9 #获取这个数据在原串中的区别
10 start_end = res.span()
11 print(start_end)#(4, 7)
'''
findall:在待校验的字符串中查找所有满足正则语法的字符串,
如果有的话吧匹配到的内容到的尼尔存放在列表中
没有匹配到数据 结果就是空列表
'''
1 pattern = 'c.t' #要找的数据时ct 组合之间有任意一个字符
2 src_str ="lll cat crt"
3 res =re.findall(pattern,src_str)
4 print(res)#['cat', 'crt']
'''
finditer:
在待校验的字符串中查找所有满足正则语法的字符串,
有的话 匹配到的内容对用match存方在一个迭代中
没有匹配到数据 结果就是一个空迭代
'''
1 pattern = 'c.t' #要找的数据时ct 组合之间有任意一个字符
2 src_str ="lll cat crt"
3 res =re.finditer(pattern,src_str)
4 print(res)#['cat', 'crt']
5 #遍历
6 for data in res:
7 print(data)
8 #<re.Match object; span=(4, 7), match='cat'>
9 #<re.Match object; span=(8, 11), match='crt'>
'''
替换操作sub
系统的祖父穿中也有一个替换的方法 relace
需要替换什么内容 指定内容替换 替换个数
'''
1 src_str ="啦啦啦 是不是脑子有坑"
2 #把坑替换成水
3 replace_str = src_str.replace('坑','水')
4 print(replace_str)#啦啦啦 是不是脑子有水
5
6 #只替换一个
7 src_str ="啦啦啦 咳咳"
8 #把咳替换成啦
9 replace_str = src_str.replace('咳','啦',1)
10 print(replace_str)#啦啦啦 啦咳
11
12 src_str = '你好00, 我是五七57'
13 #去除字符中数字
14
15 #遍历原串
16 for ch in src_str:
17 #isdigit判断是否是纯数字
18 #吧替换完成的内容赋值到变量src_str
19 if ch.isdigit():
20 src_str =src_str.replace(ch,'')
21 print(src_str)#你好, 我是
22
23 #用正则表达式
24 #正则语法[0-9]匹配0到9中任意一个数字
25 # res = re.sub('[0-9]]',src_str)
26 # print(res)#你好, 我是五七
'''
split切割
将正则语法匹配到的尼尔作为切割符 切割指定的字符串
'''
1 src_str = 'i26372hh387hdgddl'
2 #以数字切割符 切割字符串 获取单词
3 res = re.split('[0-9]+', src_str)
4 print(res)#['i', '', '', '', '', 'hh', '', '', 'hdgddl']
5 #增加+号去除“”['i', 'hh', 'hdgddl']
1 '''
2 正则表达式中的语法
3 '''
4 #(.)在正则表达式中表示的是通配符 匹配 的是除了
之外的任意字符
5 s = 'ggg
hhh%%%——'
6 res = re.findall(".",s)
7 print(res)#['g', 'g', 'g', 'h', 'h', 'h', '%', '%', '%', '—', '—']
8
9 #集合匹配[] 匹配的是中括号中列出的任意一个字符
'''
[0-9]--匹配任意一个数字
[a-z]--匹配任意小写字母
[A-Z]--匹配任意大写字母
[0-9A-Za]-- 匹配的是数字,字母中任意一个符号
[adhueur]--pip的是adhueur中任意字符
[^0-9]--匹配任意非数字字符
'''
1 s = '3746873hdshdg$$#^$_'
2 res = re.findall("[0-9a-z_]",s)
3 print(res)#['3', '7', '4', '6', '8', '7', '3', 'h', 'd', 's', 'h', 'd', 'g', '_']
#正则表达式中的转义符
#只想匹配英文符号.---匹配的是点本身的含义
#在这种时候 就需要进行转义 让其保持本意
#ip 地址校验 0.0.0.0 3673@qq.com
1 res = re.match(".","o")
2 print(res) #None
'''
d -- 与[0-9]等价 表示的是0-9 中任意一个字符
D --与[^0-9]等价 表示的是非0-9中任意一个字符
w --匹配的是数字 字母 下划线 汉字 中任意一个符号
W --将w取反 匹配的是非数字 字母 下换线 汉字中的任意一个符号
'''
1 res = re.match('d','m')
2 print(res)
3
4 res =re.match('D','O')
5 print(res)#<re.Match object; span=(0, 1), match='O'>
6
7 res = re.match('w','哈')
8 print(res)#<re.Match object; span=(0, 1), match='哈'>
'''
量词
*表示前面的符号连续出现任意次
+ 表示前面的符号连续出现至少一次
? 表示前面的符号连续出现最多一次
{m} 表示前面的符号联系出现m次 m n是数值
{m,n}表示前面的符号连续出现至少m次,最多n次
'''
1 res = re.match('.*','hsgdhs')
2 print(res)#<re.Match object; span=(0, 6), match='hsgdhs'>
3
4 res = re.match('.+','')
5 print(res)#None
6
7 res = re.match('^.{$}','666')
8 print(res)#None
9
10 res = re.match('^.{$}','888')
11 print(res)#None
12
13 res = re.match('^.{3,6}','888')
14 print(res)#None
#分组
'''
()匹配一个整体符号的
比如 163 qq sina
[163]
| 表示的是或者的关系
邮箱验证: 163 qq sina中的任意一个
邮箱格式:
数字 字母 下划线开头 个数6到12位
@163|qq|sina.com
'''
1 pattern ="^[0-9a-zA-Z_]{6,8}@(163|qq|sina).com$"
2 email = input("请输入一个邮箱:")
3 res =re.match(pattern,email)
4 if res != None:
5 print(f"{email}是合法的")
6
7 else:
8 print(f"{email}不合法")