首页 > 其他分享 >11_正则表达式入门

11_正则表达式入门

时间:2022-10-17 18:11:52浏览次数:43  
标签:11 匹配 入门 show 正则表达式 re print rm match

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

相关文章