1.正则表达式入门
正则表达式: regular expression
1. 正则表达式概念: 记录文本规则的代码(符号)
2. 正则表达式作用: 匹配或者查找符合某些规则的字符串
3. python中正则模块: re 两个英文字母的开头
4. 使用步骤:
1.导包
2.匹配
3.提取数据
2.使用match匹配
知识点:
1. match匹配格式: re.match(参数1是正则表达式,参数2是要匹配的字符串,参数3是正则修饰符)
match匹配特点: 从开头开始匹配,匹配成功就直接返回
匹配成功: 返回匹配成功的re.Match数据对象
匹配失败: 返回None
2. 使用步骤:
1.导包: import re
2.匹配: 数据对象 = re.match('正则表达式','要匹配的字符串',修饰符)
3.提取数据: 数据 = 数据对象.group()
示例:
# 1.导包
import re
# 2.匹配
rm = re.match('正则', '正则要匹配的字符串')
# 3.提取数据
# 非空即为真
if rm:
print('匹配成功:', rm.group())
else:
print('匹配失败!')
3.使用search匹配
知识点:
1. search匹配格式: re.search(参数1是正则表达式,参数2是要匹配的字符串,参数3是正则修饰符)
search匹配特点: 全文搜索,返回第一个搜索到的数据
匹配成功: 返回匹配成功的re.Match数据对象
匹配失败: 返回None
2. 使用步骤:
1.导包: import re
2.匹配: 数据对象 = re.search('正则表达式','要匹配的字符串',修饰符)
3.提取数据: 数据 = 数据对象.group()
示例:
# 1.导包
import re
# 2.匹配
rm = re.search('正则', '要匹配正则的字符串')
# 3.提取数据
# 非空即为真
if rm:
print('匹配成功:', rm.group())
else:
print('匹配失败!')
4.使用findall匹配
知识点:
1. findall匹配格式: re.findall(参数1是正则表达式,参数2是要匹配的字符串,参数3是正则修饰符)
findall匹配特点: 全文查找,返回查找到的所有数据
匹配成功: 把所有数据放到列表中,直接返回列表
匹配失败: 返回空列表
2. 使用步骤:
1.导包: import re
2.匹配: 数据列表 = re.findall('正则表达式','要匹配的字符串',修饰符)
3.提取数据: 直接打印列表或者遍历
示例:
# 1.导包
import re
# 2.匹配
list1 = re.findall('正则', '使用正则表达式匹配正则内容的字符串')
# 3.提取数据
print(list1) # ['正则', '正则']
5.正则匹配单个字符
知识点:
. : 任意一个字符(除了\n)
[] : 括号里任意一个字符
\d : 任意一个数字, 0-9
\D : 非数字
\s : 任意一个空白, 空格,制表符\t,换行\n
\S : 非空白
\w : 正常词, 字母,数字,下划线,汉字
\W : 非正常词,特殊字符
示例:
import re
# 定义一个函数,用于提取数据
def show(rm):
if rm:
print('匹配成功:', rm.group())
else:
print('匹配失败!')
# . : 任意一个字符(除了\n)
rm = re.match('.inzi.66.帅.', 'binzi666_帅气')
show(rm) # 演示.匹配任意字符
rm = re.match('binzi666.帅气', 'binzi666\n帅气')
show(rm) # 失败, 演示.不能匹配\n
print('-'*35)
# [] : 括号里任意一个字符
rm = re.match('[Bb]', 'binzi666_帅气')
show(rm)
rm = re.match('binzi[0-9]66_帅气', 'binzi666_帅气')
show(rm)
print('-'*35)
# \d : 任意一个数字, 0-9
rm = re.match('binzi\d66_帅气', 'binzi866_帅气')
show(rm)
rm = re.match('binzi\d\d\d_帅气', 'binzi888_帅气')
show(rm)
print('-'*35)
# \D : 非数字
rm = re.match('binzi\D66_帅气', 'binzi666_帅气')
show(rm) # 失败! \D不能匹配数字
rm = re.match('\Dinzi666\D帅\D', 'binzi666_帅气')
show(rm)
print('-'*35)
# \s : 任意一个空白, 空格,制表符\t,换行\n
rm = re.match('binzi666\s帅气', 'binzi666 帅气')
show(rm)
rm = re.match('binzi666\s帅气', 'binzi666\t帅气')
show(rm)
rm = re.match('binzi666\s帅气', 'binzi666\n帅气')
show(rm)
print('-'*35)
# \S : 非空白
rm = re.match('binzi666\S帅气', 'binzi666 帅气')
show(rm) # 失败! \S不能匹配空白
rm = re.match('\Sinzi\S66\S帅\S', 'binzi666&帅气')
show(rm)
print('-'*35)
# \w : 正常词, 字母,数字,下划线,汉字
rm = re.match('\winzi\w66\w帅\w', 'binzi666_帅气')
show(rm)
rm = re.match('binzi666\w帅气', 'binzi666&帅气')
show(rm) # 失败! \w不能匹配特殊字符
print('-'*35)
# \W : 非正常词,特殊字符
rm = re.match('\Winzi\W66\W帅\W', 'binzi666_帅气')
show(rm) # 失败! \W不能匹配正常词
rm = re.match('binzi666\W帅气', 'binzi666&帅气')
show(rm)
6.正则匹配多个字符
知识点:
* : 匹配前一个字符出现0次或者无限次
+ : 匹配前一个字符出现1次或者无限次
? : 匹配前一个字符出现0次或者1次
{x}: 匹配前一个字符出现x次
{x,y}:匹配前一个字符出现x到y次
示例:
import re
# 定义函数用于提取数据
def show(m):
if m:
print('匹配成功:', m.group())
else:
print('匹配失败!')
# * : 匹配前一个字符出现0次或者无限次 次数>=0
ma = re.match('t.*o', 'to') # 演示*前面字符出现0次
show(ma)
ma = re.match('t.*o', 'tbinzi666_帅气o') # 演示*前面字符出现多次
show(ma)
print('-' * 40)
# + : 匹配前一个字符出现1次或者无限次 次数>=1
ma = re.match('t.+o', 'to')
show(ma) # 失败! +表示前一个字符至少1次
ma = re.match('tw+o', 'two') # 演示+前面字符出现1次
show(ma)
ma = re.match('t.+o', 'tbinzi666_帅气o') # 演示+前面字符出现多次
show(ma)
print('-' * 40)
# ? : 匹配前一个字符出现0次或者1次 次数=0 或者 次数=1
# url里面的协议http后面s有时候0次有时候1次
ma = re.match('https?://', 'http://') # 演示?前面字符出现0次
show(ma)
ma = re.match('https?://', 'https://') # 演示?前面字符出现1次
show(ma)
print('-' * 40)
# {x}: 匹配前一个字符出现x次 次数=x
ma = re.match('binzi\d{3}_帅气', 'binzi666_帅气')
show(ma)
print('-' * 40)
# {x,y}:匹配前一个字符出现x到y次 x =< 次数 <= y
# 密码要求3-6位,字母数字下划线都可以
pwd = 'abc123a'
ma = re.match('[a-zA-Z0-9_]{3,6}',pwd)
show(ma) # 个数不够匹配失败,但是超过个数不报错,只匹配符合要求前6位
# 需求:因为是密码,个数必须符合要求才能匹配成功,一会儿使用正则匹配开头和结尾解决这个问题
7.正则匹配开头和结尾
知识点:
^ : 正则匹配以某个字符串开头
$ : 正则匹配以某个字符串结尾
注意: ^和$一般都是一起使用,当它们一起使用时可以限制长度,起到限制作用,例如下面的邮箱练习
示例:
# ^ : 正则匹配以某个字符串开头
# $ : 正则匹配以某个字符串结尾
# 注意: ^和$一般都是一起使用,起到限制作用
# 密码要求3-6位,字母数字下划线都可以
import re
# 定义函数用于提取数据
def show(m):
if m:
print('匹配成功:', m.group())
else:
print('匹配失败!')
# 需求:因为是密码,个数必须符合要求才能匹配成功
pwd = 'abc123abc'
ma = re.match('^[a-zA-Z0-9_]{3,6}$',pwd)
show(ma) # 匹配失败! 因为^和$限制密码个数
pwd = 'abc123'
ma = re.match('^[a-zA-Z0-9_]{3,6}$',pwd)
show(ma)
8.综合练习
需求:
匹配163邮箱, @之前4-20位字母数字下划线,@之后163.com 举例: [email protected]
知识点:
注意: . 有特殊含义, 如果想让.代表本身的含义点,需要加转义符\
示例:
# 1.导包
import re
# 2.匹配
m = re.match('^[a-zA-Z0-9_]{4,20}@163\.com$','[email protected]')
# 3.提取数据
if m:
print('匹配成功:',m.group())
else:
print('匹配失败!')
8.正则匹配分组
知识点:
| : 正则匹配|左边或者右边内容 或者
(xxxx): 把括号中字符串作为一个分组 ,注意分组后默认产生分组编号 从1开始
\num: 使用num对应分组的字符串
(?P<name>) : 给分组起别名
(?P=name) : 使用name对应的分组
示例:
import re
# 定义函数用于提取数据
def show(m):
if m:
print('匹配成功:', m.group())
else:
print('匹配失败!')
# (xy): 把括号中字符串xy作为一个分组, 注意分组后默认产生分组编号12...
# |: 正则匹配 | 左边或者右边内容
# 需求:匹配多个邮箱
m = re.match('^([a-zA-Z0-9_]{4,20})@(163|qq|sina)\.com$','[email protected]')
show(m)
print(m.group(0)) # group(0)拿的是匹配成功的所有数据
print(m.group(1)) # group(1) 拿到的是第一个分组里的内容
print(m.group(2)) # group(2) 拿到的是第二个分组里的内容
print('-'*40)
# \num: 使用num对应分组的字符串
# 需求: 匹配html页面标签
m = re.match('<([a-zA-Z1-6]+)>标签内容</\\1>','<html>标签内容</html>')
show(m)
print('-'*40)
# (?P<name>): 给分组起别名
# (?P=name): 使用name对应的分组
m = re.match('<(?P<zs>[a-zA-Z1-6]+)>标签内容</(?P=zs)>','<html>标签内容</html>')
show(m)
9.特殊匹配
知识点:
[^字符]: ^如果放到[]内表示取反
示例:
# [^字符]: ^如果放到[]内表示取反
# 举例: 如果字符串以数字开头,就匹配失败
# 1.导包
import re
# 定义函数提取数据
def show(m):
if m:
print('匹配成功:', m.group())
else:
print('匹配失败!')
# 2.匹配
m = re.match('^\D.*', '1abc')
show(m) # 失败!
m = re.match('[^\d].*', '1abc')
show(m) # 失败! [^\d] == ^\D
10.拓展
正则切割
import re
# 字符串切割: 要切割的字符串.split(切割内容,切几刀)
data = 'py_data_33'.split('_')
print(data)
# 正则切割: split(切割内容,要切割的字符串,切几刀)
data = re.split('_','py_data_33')
print(data)
正则替换
import re
# 字符串替换: 大字符串.replace(被替换的内容,替换后的内容)
data = '你TMD的哦'.replace('TMD','***')
print(data)
# 正则替换: re.sub(被替换的内容,替换后的内容,大字符串) subString
data = re.sub('TMD','***','你TMD的哦')
print(data)
正则修饰符
知识点:
re.S : 能够让.匹配到\n,实现了真正的任意
re.I : 匹配的时候不区分大小写
re.M : 改变^和$效果实现多行模式查找 实际上就是让它识别了\n这个换行符
正则预编译: compile() 提前把正则表达式编译成对象,之后在匹配,适用于正则表达式重复使用的情景
import re
# 定义函数提取数据
def show(m):
if m:
print('匹配成功:', m.group())
else:
print('匹配失败!')
# .默认任意字符,除了\n
# re.S : 能够让.匹配到\n,实现了真正的任意
m = re.match('.*','aaaa\nbbbb',re.S)
show(m)
print('-'*40)
# re.I : 能够让验证码实现不区分大小写
m = re.match('ab12','AB12',re.I)
show(m)
import re
m = re.match('sj','SJ',re.I)
if m:
print(m.group())
else:
print("匹配失败")
import re
m = re.match('^[a-z]{3}$','abc\ndef',re.M)
if m:
print(m.group())
else:
print("匹配失败")
预编译:
import re
m =re.compile('.*')
print(type(m))
# m2 = re.match(m,'itheima')
m2 =m.match("itheima")
if m2:
print(m2.group())
else:
print("匹配失败")
注意:
gdp_data =re.findall('<a href=""><font>(.*?)</font></a>.*?¥(.*?)亿元',html_data,re.S)
其中,.*表示匹配任意字符,0到无限次,当符合要求时,能要多长数据就要多长,属于贪婪匹配.
而在后面加一个? , 也就是.*? 时,数据则是能取多短取多短。
标签:11,匹配,入门,show,正则表达式,re,print,rm,match From: https://www.cnblogs.com/nanguyhz/p/16800127.html