正则模块简介+常用函数
-
正则:regular expression 通常我们会简写regex
-
是所有语言通用的,用来做字符串的验证
- 比如说:qq长度验证,qq是否是纯数字,邮箱长度,开头,有没有@这么多的判断,很难去写逻辑验证
-
可以在网页中 定义规则 拿到我们想要的内容
-
正则需要用到的模块:re模块
-
re模块需要掌握的方法
- 规定规则
- 对象 = re.compile(“正则”)
- 适配内容
- match_obj = 对象.match(“内容”)
- 取出内容
- print(match_obj.group())
- 规定规则
-
re.search(规则,内容) 提取数据
- 简写:
match_obj = re.match("正则","内容") print(match_obj.group()) 思考match 是如何适配内容?? match_obj = re.match("abc","abcd") print(match_obj.group()) match_obj = re.match("abc","frgabc") print(match_obj.group())
-
match_obj =re.fullmatch(“正则”,“内容”)
-
思考:full是啥意思?? full是完全
-
思考:和match有啥区别呀?? match是匹配开头,fullmatch则是全部匹配
-
思考如果需要 提取符合规则的字符串怎么搞
- match_obj =re.search(“正则”,“内容”)
- print(match_obj.group())
- print(match_obj.span())
-
思考span 和 group 都是什么意思??
- 注意:search 只要找到一个匹配的 后面的就不再找了
-
?? =re.findall(“正则”,“内容”)
- print(??)
- 这个方法返回的是啥???
- 直接返回匹配的字符串
-
正则之常用符号(.[],量词)
- .:匹配任意字符,除了换行符 \n
-
例如:
match_obj = re.fullmatch("a.b","a+b") print(match_obj)
-
[]:在[]任意一个都可以
-
例如:
match_obj = re.fullmatch("a[a-z]b","a+b") print(match_obj)
-
注意:这些都是修饰前面 内容的
-
*:0或者更多个
-
“[a-z]*” 表示这里可以匹配0个或者多个小写字母
-
+:最少一个或者多个
- “[0-9]+” 表示这里可以匹配1个或者多个的数字
-
?:只有0或者1个
- “\w?” 表示这里可以匹配0个或者1个合法字符
-
例:验证一个字符串两头是数字,中间是字母
import re str = input("请输入一个字符串") match_obj = re.match("^[0-9]+[a-zA-Z]+[0-9]+$",str) if match_obj: print(match_obj.group()) else: print("无匹配字符串")
-
正则之量词和预定义字符,判断开头和结尾
预定义字符: \d:0~9 \w:a-zA-z0-9_ 数字字母下划线 \s:空白字符 \S:非空白字符 \D:除了0~9 都行 \W:特殊符号:+ - * ? >........ 量词:写在后面修饰前面的 {数字}:固定长度 {数字,}: 长度>=数字 {n,m}: n<=长度 <=m
-
例:qq号码 不能0开头 都是数字:6到9位数
import re qq = input("请输入qq:") match_obj = re.match("^[1-9][0-9]{5,8}",qq) if match_obj: print(match_obj.group()) else: print("输入有误")
-
例:检测合法的变量名,有列表:[“age”,“age","__”,“1name”,“name!”,“a1”,“k#”]
import re
name_li = ["age","_age","___","1name","name!","a1","k#"]
for name in name_li:
match_obj = re.match(r"^[a-zA-Z_]\w*$",name)
if match_obj:
print("合法",name)
else:
print("不合法",name)
- 验证用户名: 可以是字母数字下划线,不能是数字或者_开头,用户名长度必须6位以上
import re
user_name = input("请输入用户名")
match_obj = re.match(r"[a-zA-Z]\w{5,}",user_name)
if match_obj:
print("合法",user_name)
else:
print("不合法")
-
手机号码验证:1开头 可以是13/15/18xxxxxxx 11位
import re num = input("请输入手机号") match_obj = re.match(r"^[1](3|5|8)[0-9]{9}",num) if match_obj: print("合法",num) else: print("不合法")
-
座机:区号-电话号码 区号必须3或者四位 电话号码是8位数字
import re num = input("请输入电话号码") match_obj = re.fullmatch(r"^[0][0-9]{2,3}([0-9]{8})",num) if match_obj: print("合法",num) else: print("不合法")
-
re.sub(“正则”,用于替换的内容,源字符串)
-
re.sub(“正则”,函数名,源字符串)
-
先思考: 要不要参数,要不要返回值
- def 函数名():
pass
- def 函数名():
-
re.sub(“正则”,函数名,用于替换的内容)
-
有字符串 = “xiaohua=20 xiaoming=21 xiaohong=19”
将年龄>=20岁的+1import re str1 = "xiaohua=20 xiaoming=21 xiaohong=19" def change(age): age = int(age.group()) if age > 19: age +=1 return str(age) result = re.sub(r"\d{2}",change,str1) print(result)
-
正则分组:
知道引用分组匹配到的数据对应的正则表达式代码 1. 匹配分组相关正则表达式 | 匹配左右任意一个表达式 (规则) 将括号中规则作为一个分组 \num 引用分组num匹配到的字符串,保证跟分组内容一模一样 (?P<name>) 分组起别名 (?P=name) 引用别名为name分组匹配到的字符串
- 示例1:
- 需求:在列表中[“apple”, “banana”, “orange”, “pear”],匹配apple和pear
import re
name_li=["apple", "banana", "orange", "pear"]
for name in name_li:
match_obj = re.match("apple|pear",name)
if match_obj:
print(match_obj.group())
- 示例 :分组
- 需求:匹配出163、126、qq等邮箱,邮箱名字1到20个字母或者数字,大写字母,小写字母都可以
思考匹配邮箱 输入111@163.comcom 或者 111@163acom
import re
email = input("请输入邮箱")
match_obj = re.match(r"\w{1,20}@(163|126|qq)\.com$",email)
if match_obj:
print("邮箱合法",email)
else:
print("邮箱非法")
正则之贪婪与非贪婪
-
知道贪婪的特点
-
掌握非贪婪的使用
-
Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;
-
例如:(敲)
#蔡徐坤唱跳rap#微博话题# 现在就想拿 #蔡徐坤唱跳rap# import re str1 = "#蔡徐坤唱跳rap#微博话题#" match_obj = re.match("^#.*?#",str1) print(match_obj.group())
-
非贪婪则相反,总是尝试匹配尽可能少的字符。