正则表达式-匹配

正则表达式

概念

        正则表达式:(regular expression)描述了一种字符串匹配的模式,可以用来检查一个大字符串中是否含有某种子串,将匹配的子串做替换或者从某个子串中取出符合某个条件的子串等.

模式:一种特定的字符串模式,这个模式是通过一些特殊的符号组成的

特点:

        1.正则表达式的语法令人头疼,可读性差

        2.正则表达式通用性很强,能够适用于很多编程语言

正则表达式匹配方式

match匹配:

        match匹配格式:re.match(正则表达式,大字符串,标志位)

        match匹配规则:只能从头开始匹配,只能返回第一个匹配成功的数据

         注意:匹配成功后结果是re.match对象,想要获取对应匹配数据使用group()函数

                 如果匹配失败返回none

search匹配:

        search匹配格式:re.search(正则表达式,大字符串,标志位)

        search匹配规则:可以扫描整个大字符串进行匹配,只能返回第一个匹配成功的数据

        注意:匹配成功后结果是re.match对象,想要获取对应匹配数据使用group()函数

                 如果匹配失败返回none

findall匹配:

         findall匹配格式:re.findall(正则表达式,大字符串,标志位)

         findall匹配规则:可以扫描整个大字符串进行匹配,把所有匹配成功的数据放到列表中返回

        注意:如果匹配失败返回的是空列表[ ]

match匹配示例

# 导包
import re

# 匹配
big_str = '春天花会开'
result = re.match('春天', big_str)
print(result, type(result))  # <...><class 're.Match'>
if result:
    print(f'匹配成功:{result.group()}')  # 匹配成功:春天
else:
    print('匹配失败')

search匹配示例

# 导包
import re

# 匹配
big_str = '<td><img src="../images/1.jpg" width="200px" height="260px" /></td>'
result = re.search('src', big_str)
print(result, type(result))  # <...><class 're.Match'>
if result:
    print(f'匹配成功:{result.group()}')  # 匹配成功:src
else:
    print('匹配失败')

findall匹配示例

# 导包
import re

# 匹配
big_str = """
<tr>
                <td><img src="../images/1.jpg" width="200px" height="260px" /></td>
                <td><img src="../images/2.jpg" width="200px" height="260px" /></td>
                <td><img src="../images/3.jpg" width="200px" height="260px" /></td>
                <td><img src="../images/4.jpg" width="200px" height="260px" /></td>
                <td><img src="../images/5.jpg" width="200px" height="260px" /></td>
                <td><img src="../images/6.jpg" width="200px" height="260px" /></td>

            </tr>
"""
result = re.findall('<img src', big_str)
print(result, type(result))  # ['<img src', '<img src', '<img src', '<img src', '<img src', '<img src'] <class 'list'>
if result:
    print(f'匹配成功:{result}')  # 匹配成功:['<img src', '<img src', '<img src', '<img src', '<img src', '<img src']
else:
    print('匹配失败')

匹配模式练习

# 需求:已知页面部分源码,其中包含了很多图片标签,要求扫描整个字符串,提取每个图片的路径
# 方式1
# 导包
import re

# 匹配
big_str = """
<tr>
                <td><img src="../images/1.jpg" width="200px" height="260px" /></td>
                <td><img src="../images/2.jpg" width="200px" height="260px" /></td>
                <td><img src="../images/3.jpg" width="200px" height="260px" /></td>
                <td><img src="../images/4.jpg" width="200px" height="260px" /></td>
                <td><img src="../images/5.jpg" width="200px" height="260px" /></td>
                <td><img src="../images/6.jpg" width="200px" height="260px" /></td>

            </tr>
"""
result = re.findall('<img src="../images/\d.jpg"', big_str)
print(result, type(result))
# ['<img src="../images/1.jpg"', '<img src="../images/2.jpg"', '<img src="../images/3.jpg"', '<img src="../images/4.jpg"', '<img src="../images/5.jpg"', '<img src="../images/6.jpg"'] <class 'list'>
if result:
    print(f'匹配成功:{result}')  # 匹配成功:['<img src', '<img src', '<img src', '<img src', '<img src', '<img src']
else:
    print('匹配失败')

匹配字符

知识点

单独匹配1个字符:

        .  :任意1个字符(除了\n)

       [ ]  :中括号里任意1个字符

     [^x ]  :如果在括号里,代表除了后面的x,其他任意1个字符

        \d  :任意1个数字

        \D  :任意1个非数字

        \w  :任意1个正常字符(字母数字下划线汉字)

        \W  :任意1个非正常字符(特殊字符)

        \s    :任意1个空白(空格,制表符\t,换行符\n)

        \S   :任意1个非空白

匹配前一个字符出现次数

        *   :匹配前1个字符出现0次或者多次

        +  :匹配前1个字符出现1次或者多次

        ?  :匹配前1个字符出现0次或者1次

        {x}:匹配前1个字符出现x次

        {x,}:匹配前1个字符至少出现x次

        {x,y}:匹配前1个字符至少出现x次,最多y次

匹配开头和结尾:

        ^   :匹配字符串以...开头

        $   :匹配字符串以...结尾

匹配分组操作:

        (xy) :匹配分组,xy内容成为一组数据,自动生成一个从1开始的编号

        (x|y) :匹配分组,x或者y是分组数据

匹配字符示例

# 导包
import re


# 定义函数判断结果
def show(result):
    if result:
        print(f'匹配成功:{result.group()}')
    else:
        print('匹配失败')


# .:匹配任意一个字符,除了/n
result = re.match('.i.i.66.漂.', 'xixi666_漂亮')
show(result)  # 匹配成功:xixi666_漂亮
# []:中括号中任意一个字符
result = re.match('[a-zA-Z0-9_]', 'xixi666_漂亮')
show(result)  # 匹配成功:x
# [^]:如果^在中括号中代表除了x外的任意一个字符
result = re.match('[^x]', 'xixi666_漂亮')
show(result)  # 匹配失败
# ^:如果^不在中括号里代表以...开头  $:以...结尾
result = re.match('^xixi666_漂亮$', 'xixi666_漂亮')
show(result)  # 匹配成功:xixi666_漂亮
# *:不能单独使用,一般放在某个字符后,代表这个字符出现0次或者多次,次数>=0
result = re.match('[a-zA-Z0-9_]*', 'xixi666_漂亮')
show(result)  # 匹配成功:xixi666_
# +:不能单独使用,一般放在某个字符后,代表这个字符出现1次或者多次,次数>=1
result = re.match('[a-zA-Z0-9_]+', 'xixi666_漂亮')
show(result)  # 匹配成功:xixi666_
# ?:不能单独使用,一般放在某个字符后,代表这个字符出现0次或者1次,次数=0或=1
result = re.match('[a-zA-Z0-9_]?', 'xixi666_漂亮')
show(result)  # x
#{x,}:不能单独使用,一般放到某个字符后,代表这个字符至少出现x次
result = re.match('[a-zA-Z0-9_]{6,}', 'xixi666_漂亮')
show(result)  # 匹配成功:xixi666_
#注意:^和$一般配合使用,起到限制作用
#{x,y}:不能单独使用,一般放到某个字符后,代表这个字符出现x到y次
result = re.match('^[a-zA-Z0-9_]{6,10}$', 'xixi666_漂亮')
show(result)  # 匹配成功:xixi666_
#\d:任意一个数字
result = re.match('xixi\d{3}_漂亮', 'xixi666_漂亮')
show(result)  #匹配成功:xixi666_漂亮
#\D任意一个非数字
result = re.match('xixi666\D漂\D', 'xixi666_漂亮')
show(result)  #匹配成功:xixi666_漂亮
#\w任意1个正常字符(字母,数字,下划线,汉字)
result = re.match('x\wxi6\w6\w漂\w', 'xixi666_漂亮')
show(result)  #匹配成功:xixi666_漂亮
#\W任意1个非正常字符
result = re.match('xixi666\W漂亮', 'xixi666%漂亮')
show(result)  #匹配成功:xixi666%漂亮
#\s:任意一个空白(空格,\t制表符,\n换行符)
result = re.match('xixi666\s漂亮', 'xixi666 漂亮')
show(result)  #匹配成功:xixi666 漂亮
#\S:任意一个非空白
result = re.match('\Sixi\S66 漂亮', 'xixi666 漂亮')
show(result)  #匹配成功:xixi666 漂亮

正则表达式综合练习

# 1.导包
import re


# 提前定义函数用于

展示结果
def show(result):
    if result:
        print(f'匹配成功:{result.group()}')
    else:
        print('匹配失败!!!')


# 2.匹配
# 需求1: 匹配微博话题
str1 = '#幸福是奋斗出来的#'
result = re.match('#.+#', str1)
show(result)
# 需求2: 匹配1开头的11位手机号
str2 = '13866668888'
result = re.match('^1[3-9]\d{9}$', str2)
show(result)
# 需求3: 匹配163邮箱地址 要求@符号前4到10位的字母数字或者下划线
str3 = 'binzi@163.com'
# \转义符: \.此处.只代表符号原始含义
result = re.match('^[a-zA-Z0-9_]{4,10}@163\.com$', str3)
show(result)

# 补充正则表达式匹配分组
result = re.match('^([a-zA-Z0-9_]{4,10})@(163\.com)$', str3)
# 注意: 0代表匹配到的所有数据,可以省略不写
print(result.group(0))
print(result.group())
# 注意: 上述小括号()代表一个分组,每个分组自动生成了对应的编号(从1开始)
# 获取第1个分组内容
print(result.group(1))
# 获取第2个分组内容
print(result.group(2))
# 注意: 访问不存在的分组就会报错
# print(result.group(3))

# 需求4: 在上述匹配邮箱案例中,优化下既能匹配163邮箱,也能匹配qq邮箱,google邮箱,sina邮箱
str4 = 'binzi@qq.com'
result = re.match('^[a-zA-Z0-9_]{4,10}@(163|qq|google|sina)\.com$', str4)
show(result)

贪婪模式和非贪婪模式

知识点

贪婪模式:在匹配成功的前提下,尽可能多的匹配

贪婪模式:在匹配成功的前提下,尽可能少的匹配\

举例:

        贪婪模式:   .*  或者  .+

        非贪婪模式:   .*?  或者  .+?

示例

# 1.导包
import re

# 需求:已知以下字符串,采用两种模式匹配内容,观察结果
html_str = '<label>用户名</label><label>密码</label><label>性别</label>'
# 贪婪模式: .* 或者 .+
data = re.findall('<label>(.*)</label>', html_str)
print(data)  # ['用户名</label><label>密码</label><label>性别']
# 非贪婪模式: .*? 或者 .+?
data = re.findall('<label>(.*?)</label>', html_str)
print(data)  # ['用户名', '密码', '性别']

正则表达式标志位

知识点

re.I :忽略大小写比较

re.S :让 . 匹配到\n,实现真正的任意

示例

"""
re.I: 忽略大小写比较
re.S: 让.能够匹配到\n
"""
import re


# 提前定义函数用于展示结果
def show(result):
    if result:
        print(f'匹配成功:{result.group()}')
    else:
        print('匹配失败!!!')


# 案例1: 验证码忽略大小写比较
yzm = 'A2cD'
result = re.match('a2cd', yzm, re.I)
show(result)  # 匹配成功:A2cD

# 案例2: .匹配\n
name = '你笑起来真好看\n像春天的花儿一样'
# 注意: .默认不能匹配\n
result = re.match('.*', name)
show(result)  # 匹配成功:你笑起来真好看
# 注意: re.S: 让.能够匹配到\n
result = re.match('.*', name, re.S)
show(result)  # 匹配成功:你笑起来真好看
# 像春天的花儿一样

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值