一、正则表达式的概念
正则表达式(regular expression)本质就是各种符号,通过这些符号,在大字符串中匹配、查找
指定字串,它适用于多种编程语言。
正则表达式的功能:
① 数据验证(表单验证、如手机、邮箱、IP地址)
② 数据检索(数据检索、数据抓取)
③ 数据隐藏(130****1234 某先生)
④ 数据过滤(论坛敏感关键词过滤)
…
二、re模块
1.re模块三步走:
①导入re模块
②使用match方法进行匹配操作(match方法只能从头开始匹配,只能返回匹配成功的第一个)
result = re.match(pattern正则表达式,string要匹配的字符串,fiags = 0)
③数据匹配成功,使用group方法来提取数据
# 1.导包
import re
# 需求: 已知一个字符串,my_str = '张三学习非常优秀是班级的学习委员'
my_str = '张三学习非常优秀是班级的学习委员'
print(my_str)
print('----------------------------------')
# 2.1使用match进行匹配
# TODO 注意: match只能从开头开始匹配,只能返回匹配成功第一个
result = re.match('张三', my_str)
print(result, type(result))
# 3.1提取匹配结果
if result:
print(result.group())
else:
print('匹配失败')
print('---------------------------------')
result = re.match('学习', my_str)
print(result, type(result))
# 3.2提取匹配结果
if result:
print(result.group())
else:
print('匹配失败')
2.其他方法(search,finfall)
search方法(可以全文搜索,但是只能返回匹配成功的第一个)
# 1.导包
import re
my_str = '张三学习很好是学习委员'
result = re.search('学习', my_str)
print(result, type(result))
if result:
print(result.group())
else:
print('匹配失败')
findall方法(可以搜索全文,并且可以返回所有匹配成功的结果)
# 1.导包
import re
my_str = '张三学习很好是学习委员'
result = re.findall('教育', my_str)
print(result, type(result))
三、正则表达式规则
导包和定义的函数后,后面直接使用即可
# 导包
import re
# 定义函数
def get_result(result):
if result:
print(f'匹配成功:{result.group()}')
else:
print('匹配失败!!!')
1.匹配单个字符
result = re.match('.........', 'Bg666_ 牛*')
get_result(result)
result = re.match('[A-Z][a-z][0-9][0-9][0-9][_]', 'Bg666_')
get_result(result)
2.匹配多个字符
result = re.match('.*', 'Bg666_ 牛*!@#$%^&*()-\t')
get_result(result)
result = re.match('https?://', 'http://')
get_result(result)
result = re.match('https?://', 'https://')
get_result(result)
result = re.match('[A-Za-z0-9_]*', 'Bg666_')
get_result(result)
3.匹配开头和结尾
import re
# 需求: 匹配银行取款密码,长度为6
result = re.findall('^\d{6}$', '123456')
print(result)
# 需求: 匹配网银密码,字母数字下划线混合,长度6-12
result = re.findall('^[a-zA-Z0-9_]{6,12}$', 'ABCDabcd_123')
print(result)
4.提取分组内容
(xy) : 把括号中的x和y作为一个整体分组 (x|y): 把括号中的x或者y作为一个分组 \组号 : 注意: 每个()分组后自动产生一个从1开始的编号,\编号就能获取到对应分组内容
import re
def get_result(result):
if result:
print(f'匹配成功:{result.group()}')
else:
print('匹配失败!!!')
# 注意: \本身有特殊含义,所以要多加一个转义符号\
# TODO 注意: 分组情况下match匹配成功,也是返回的所有内容
my_str = "<body><h1>一级标题</h1></body>"
result = re.match('<(body)><(h1)>.*</\\2></\\1>', my_str)
get_result(result)
print('----------------------------------------------------')
# TODO 注意: 1个分组情况下findall自动把本次匹配成功的内容放到列表中返回
result = re.findall('<(body)><h1>.*</h1></\\1>', my_str)
print(result)
print('----------------------------------------------------')
# TODO 注意: 多个分组情况下findall自动把本次匹配成功的多个分组内容封装成元组再放到列表中返回
result = re.findall('<(body)><(h1)>.*</\\2></\\1>', my_str)
print(result)
5.正则修饰符
# 导包
import re
# 定义函数
def get_result(result):
if result:
print(f'匹配成功:{result.group()}')
else:
print('匹配失败!!!')
# 需求: re.I 忽略大小写比较验证码
result = re.match('AB12', 'ab12')
get_result(result)
result = re.match('AB12', 'ab12', re.I)
get_result(result)
print('---------------------------------')
# 需求: re.S 匹配换行符
result = re.match('.*', 'a\nb')
get_result(result)
result = re.match('.*', 'a\nb', re.S)
get_result(result)