一.正则表达式
- 正则表达式定义:一种匹配字符串的规则
- 应用领域:
- 登录注册页的表单验证
- 爬虫
- 自动化开发,日志文件
- 惰性匹配:量词?
二.re模块用法
# import re # 导入re模块
- findall方法
# findall *****
# ret = re.findall('\d+','shd312sa14sda123') # 参数(正则表达式,字符串) 返回值类型:列表 返回值:1个
# print(ret)
# for i in ret: # 拿到的是一个全集的列表
# print(ret)
- search方法
# search *****
# ret1 = re.search('\d+','shd312sa14sda123') # 返回值类型:是一个匹配正则表达式的对象 返回值:获取匹配内容的第一个值
# ret1 = re.search('\d+','shdsasda12')
# print(ret1,type(ret1))
# print(ret1.group()) # 通过group来获取值
- match方法
# match **
# ret2 = re.match('\d+','shd312sa14sda123')
# print(ret2) # 跟search用法相似,区别:'^\d+' 从头开始获取第一个值,找不到匹配的项,返回None
# print(ret2.group()) # 找不到值,会报错
- 替换(sub,subn)
# 替换(sub,subn) ***
# print('replace123'.replace('123','H'))
# ret3 = re.sub('\d+','H','12rep23lace4321') # 默认是替换所有匹配的项
# ret4 = re.sub('\d+','H','12rep23lace4321',1) # 可以控制替换的次数
# print(ret3,ret4)
# ret5 = re.subn('\d+','H','12rep23lace4321') # 与sub用法一样,区别:会统计替换的次数,返回的是一个元组
# ret6 = re.subn('\d+','H','repace')
# print(ret6)
# for i in ret6:
# print(i)
- 切割split
# 切割(split) ***
# ret7 = re.split('\d+','re21pl42ce21')
# print(ret7)
进阶方法 - 爬虫\自动化开发
- compile
# complie ***** 时间效率
# ret8 = re.compile('-\d+\.\d+|-[1-9]\d+') # 将正则表达式进行编译,-->python解释器能理解的代码,执行代码
# print(ret8)
# ret8 = ret8.search('ads-3fafsa-21') # 能够调用re模块的所有方法
# print(ret8.group())
# 节省时间:只有在多次使用某一个相同的正则表达式的时候,这个compile才会帮助我们提高程序效率
- finditer
# finditer ***** 空间效率
# ret9 = re.finditer('\d+','shd312sa14sda123')
# print(ret9) # 拿到的是一个对象的内存地址
# for i in ret9:
# print(i.group()) # 得到的是一个迭代器,通过group获取值
三.分组练习
- findall分组
# ret1 = re.findall('www.(baidu|chrome).com','www.chrome.com') # 在findall方法里,()分组会优先显示
# print(ret1)
# ret2 = re.findall('www.(?:baidu|chrome).com','www.chrome.com') # (?:) 是取消分组
# print(ret2)
- split分组
# ret4 = re.split('(\d)','this1is2a3good4day') # split正则表达式分组,会将切割掉的内容打印出来
# print(ret4)
- search分组
# ret6 = re.search('\d+(\.\d+)(\.\d+)(\.\d+)','1.2.3.4asfaq') # 在search分组中,group(1),表示第一个分组的内容
# print(ret6.group())
# print(ret6.group(1))
# print(ret6.group(2))
# print(ret6.group(3))
# print(ret6.group(0)) # 打印与之相匹配的所有内容,跟ret6.group()打印的结果是一样的
- 总结
# python中的正则表达式
# findall 会优先显示分组中的内容,要想取消分组优先,(?:正则表达式)
# split 遇到分组 会保留分组内被切掉的内容
# search 如果search中有分组的话,通过group(n) 就能够拿到group中的匹配的内容
# search 如果search中有分组的话,通过group(n)就能够拿到group中的匹配的内容
四.分组命名
- (?P<name>)命名
# ret = re.search(r'<(?P<tag_name>\w)>\w+</(?P=tag_name)>','<a>wahaha</a>')
# print(ret.group('tag_name'))
# (?P<name>) 正则表达式,给分组起名字
# (?P=name)表示使用这个分组,匹配到的内容应该和分组中的内容完全相同
- 通过索引命名
# ret1 = re.search(r'<(\w)>\w+</\1>','<a>wahaha</a>')
# print(ret1.group(1))
# \1 表示使用第一组,匹配到的内容应该与第一组的内容完全相同
- 总结
# 正则表达式进阶
# 分组命名
# (?P<name>) 正则表达式,给分组起名字
# (?P=name)表示使用这个分组,匹配到的内容应该和分组中的内容完全相同
# 通过索引使用分组
# \1 表示使用第一组,匹配到的内容应该与第一组的内容完全相同
五.random取随机模块
# import random # 导入随机数模块
- 随机小数
# 0-1内随机小数
# ret = random.random()
# # 在一个范围内随机取小数:例:(1-5)
# ret1 = random.uniform(1,5)
- 随机整数
# ret2 = random.randint(1,2) # 在包含2的范围内随机取整数
# ret3 = random.randrange(1,2) # 在不含2的范围内取整数
- 随机抽取
# lst = ['阳光','帅气','可爱','萌气',('活泼','热情')]
# ret4 = random.choice(lst) # 在一个范围内随机抽取一个数
# ret6 = random.sample(lst,2) # 在一个范围内随机抽取两个数
- 打乱顺序
ret5 = random.shuffle(lst) # 在一个范围内随机打乱顺序
- 生成随机数案例
# 数字/数字,字母
# def rand_code(n=6,alph_flag = True):
# code = ''
# for i in range(n):
# rand_num = str(random.randint(0,9))
# if alph_flag:
# rand_alph = chr(random.randint(97,122))
# rand_alph_upper = chr(random.randint(65,90))
# rand_num = random.choice([rand_num,rand_alph,rand_alph_upper])
# code += rand_num
# return code
# ret = rand_code(4,alph_flag=False)
# print(ret)