模块
python 中使用正则模块 re,以下简单介绍一下模块0.0
概念
模块就是一个特殊的包,一个模块中存放很多个方法 一个模块类比成一个py文件 模块中的方法类比成py文件中的函数、类
分类
1.内置模块:python解释器封装好,能直接进行使用的模块 keyword模块(获取python内置关键字) re os time random 2.自定义模块:程序员根据自己程序的需求编写模块 3.第三方模块:别人编写好的上传到服务器中的模块。如果想要使用需要下载安装
使用
1.第一种方式 import 模块名 模块名.方法名() 2. 第二种方式 from 模块名 import 方法名 方法名()
正则表达式
概念
正则
用于从字符串中提取合规的子字符串使用、验证字符串是否合规
基础使用
re模块中match方法 import re # match() # 语法:re.match(r'正则表达式',进行校验或匹配的字符串) # 作用:从字符串开头开始匹配,一旦匹配成功立马返回对象,匹配失败返回None; # ret.group() 如果匹配成功则打印匹配成功的数据,匹配失败会报错 my_str = "激情激情速度与激情" ret = re.match(r"激情",my_str) print(ret.group())
元字符
import re # 元字符:匹配单个的字符、一个字符 # \d:匹配数字0-9之间的任意一个 # \D:匹配除数字以外的任意一个字符 # \w:匹配数字、字母、下划线、中文中的任意一个字符 # \W:匹配除数字、字母、下划线、中文中的任意一个字符 # \s:匹配空白字符(空格、\n、\t……) # \S:匹配非空白字符 # []:字符组、匹配字符组中的任意一个字符 # [5-8]:匹配数字5-8之间的任意一个字符 # [2-57-9]:匹配数字2-5、7-9之间的任意一个字符 # [c-fC-F]:匹配字母c-f之间的任意一个字符(不区分大小写) # [0-9a-zA-Z]:匹配数字字母 # .:匹配除\n以外的任意一个字符 # ^:以……开头 (match方法本身要求从字符串开头开始匹配,所以对于match来说,写^与不写^没有区别) # $:以……结尾 (一般使用match方法将^$加上) my_str = "速度与激情1" ret = re.match(r"^速度与激情\d$",my_str) print(ret.group())
量词
量词:指定量词前的元字符要匹配的次数,量词一定要与元字符搭配使用,不能单独使用 import re # 量词:指定量词前的元字符要匹配的次数,量词一定要与元字符搭配使用 # *:匹配0次或无数次 # +:匹配1次或无数次 # ?:匹配0次或1次 # {}:指定匹配的次数 # {n}:匹配量词前的元字符n次 # {m,n}:匹配量词前的元字符至少m次,最多n次 # {m,}:匹配量词前的元字符至少m次 # {,n}:匹配量词前的元字符最多n次 my_str = "速度与激情" ret = re.match(r"^速度与激情\d{,3}$",my_str) print(ret.group())
贪婪与非贪婪匹配
贪婪匹配:尽可能多的匹配字符,一般是+前匹配 非贪婪匹配:尽可能少的匹配字符,一般是?前匹配 # *:匹配0次或无数次 可有可无 # +:匹配1次或无数次 贪婪匹配 # ?:匹配0次或1次 非贪婪匹配
分组与或
from re import match # 分组 () # 或 | # 让用户输入自己的邮箱,正则验证邮箱是否合法 # 邮箱规则:@前由6-14位数字字母下划线组成,@后可以匹配多种邮箱 例如:139.com移动、163.com网易、sina.com新浪、qq.com腾讯 email = input("请输入你的邮箱:") ret = match(r"^[0-9a-zA-Z_]{6,14}@(qq|163|139|sina)\.com$",email) print(ret.group())
获取分组匹配成功的数据
from re import match email = input("请输入你的邮箱:") ret = match(r"^[0-9a-zA-Z_]{6,14}@(qq|163|139|sina)\.com$",email) # 验证邮箱是否合规,如果合规则判断当前用户输入的邮箱属于哪个公司 # 如果正则匹配成功,ret返回一个对象;匹配失败则返回None if ret: print("邮箱合法") # 判断是哪一个公司的邮箱-->根据正则中第一个分组匹配成功的数据进行判断 # ret.group():获取具体匹配成功的整个数据 # ret.group(1):获取正则中第一个分组具体匹配成功的数据 name = ret.group(1) print(name) if name == "qq": print("腾讯邮箱") elif name == "163": print("网易邮箱") elif name == "139": print("移动邮箱") elif name == "sina": print("新浪邮箱") else: print("邮箱不合规")
使用分组
正则案例-匹配标签名
from re import match # 正则验证网页标签内容 # <标签名>内容</标签名> # 内容规则:内容可以匹配任意类型数据 数量可有可无 # 标签名规则: # 1.第一个字符 小写字母 必须有 # 2.第二个字符 可以是小写字母,也可以是数字1-6 可有可无 有最多只能有1个 # 3.从第三个字符开始 全由小写字母组成 可有可无 有可以有无数个 # 例如: # <a></a> # <p></p> # <h3></h3> # <font></font> # <marquee></marquee> # 内容正则:.* # 标签名正则: [a-z][a-z1-6]?[a-z]* # 1.[a-z] # 2.[a-z1-6]? # 3.[a-z]* # 存在的问题:如果开始标签与结束标签不一致,也可以正常匹配成功????? # 要求:开始标签和结束标签必须匹配一样的数据 # 实现:要求结束标签标签名(匹配规则、匹配数据)都要与开始标签一致 # 解决方法:让结束标签使用开始标签的分组 my_str = "<a>我是法外狂徒张三</h3>" ret = match(r"^<[a-z][a-z1-6]?[a-z]*>.*</[a-z][a-z1-6]?[a-z]*>$",my_str) print(ret.group()) # 匹配成功
使用分组方式一:
# 使用分组: # 第一种方式:使用分组序号寻找分组 # 1. 将开始标签标签名组成一个分组 作为整个正则中的第一个分组 分组序号 1 # 2. 让结束标签使用开始标签的分组 \分组序号 \1 my_str = "<a>我是法外狂徒张三</a>" ret = match(r"^<([a-z][a-z1-6]?[a-z]*)>.*</\1>$",my_str) print(ret.group()) # 如果结束标签与开始标签不一致则报错
使用分组方式二:
# 使用分组: # 第二种方式:使用分组名寻找分组 # 1. 将开始标签标签名组成一个分组 (正则表达式) # 2. 给开始标签的分组起别名 (?P<别名>正则表达式) # 3. 给结束标签的标签名设置分组 () # 3. 让结束标签使用开始标签的分组 (?P=别名) my_str = "<a>我是法外狂徒张三</a>" ret = match(r"^<(?P<aaa>[a-z][a-z1-6]?[a-z]*)>.*</(?P=aaa)>$",my_str) print(ret.group())
常用方法
match
import re my_str = "这个视频的播放量位459295,点赞量位74563,转发量位2458" # 正则查询字符串中的数字 # 数字正则:\d+ # match() # 语法:re.match(r"正则",字符串) # 作用:从字符串开头开始匹配。一旦匹配成功立马返回对象,匹配失败返回None; # ret.group() 如果匹配成功返回具体匹配成功的数据,匹配失败则报错 ret = re.match(r"\d+",my_str) print(ret) print(ret.group())
search
import re my_str = "这个视频的播放量位4879615,点赞量位18485,转发量位254" # 正则查询字符串中的数字 # 数字正则:\d+ # search() # 语法:re.search(r"正则",字符串) # 作用:从字符串任意位置开始匹配。一旦匹配成功立马返回对象,匹配失败返回None # ret.group() 如果匹配成功返回具体匹配成功的数据,匹配失败则报错 ret = re.search(r"\d+",my_str) print(ret.group())
findall
import re my_str = "这个视频的播放量位4879615,点赞量位18485,转发量位254" # 正则查询字符串中的数字 # 数字正则:\d+ # findall() # 语法:re.findall(r"正则",字符串) # 作用:以列表的形式返回字符串中所有符合规则的数据,如果没有匹配成功的数据则返回空列表 ret = re.findall(r"\d+",my_str) print(ret)