python - 正则表达式与re模块用法

一.正则表达式

  • 正则表达式定义:一种匹配字符串的规则
  • 应用领域:  
      1. 登录注册页的表单验证 
      2. 爬虫
      3. 自动化开发,日志文件
  • 惰性匹配:量词?

二.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)

猜你喜欢

转载自www.cnblogs.com/jiujiang/p/11312698.html