• 测开不得不会的python之re模块正则表达式匹配


    学习目录

    正则表达式介绍

    正则表达式的常用符号

    python的re模块

    findall()函数

    finditer()函数

    match()函数

    search()函数

    split()函数

    正则表达式的介绍

    Python 通过标准库中的 re 模块来支持正则表达式。

    正则表达式作为高级的文本模式匹配、抽取、和搜索。简单地说,正则表达式(简称为 regex)是一些由字符和特殊符号组成的字符串,按照设定的匹配逻辑能够匹配一系列有相似特征的字符串。

    举例:re模块的findall函数在大量的文本信息中找到“3位区号-7位数字”的固定电话号码。

    1. sr = '足看025-2322222,呢023-32322,噢00哦30哦0290231312312' * 5
    2. print(re.findall('\d{3}-\d{7}',sr))
    3. 打印结果如下:找到了5个号码
    4. ['025-2322222', '025-2322222', '025-2322222', '025-2322222', '025-2322222']

    正则表达式的符号介绍

    常用到到的表达式符号如下,将不同的符号组合为正则表达式

    符号

    解释

    示例

    re1|re2

    匹配正则表达式 re1 或者 re2

    foo|bar

    .

    匹配任何字符(除了\n 之外)

    b.b

    ^

    匹配字符串起始部分

    ^Dear

    $

    匹配字符串终止部分

    /bin/*sh$

    *

    匹配 0 次或者多次前面出现的正则表达式

    [A-Za-z0-9]*

    +

    匹配 1 次或者多次前面出现的正则表达式

    [a-z]+\.com

    ?

    匹配 0 次或者 1 次前面出现的正则表达式

    goo?

    {N}

    匹配 N 次前面出现的正则表达式

    [0-9]{3}

    {M,N}

    匹配 M~N 次前面出现的正则表达式

    [0-9]{5,9}

    […]

    匹配来自字符集的任意单一字符

    [aeiou]

    [..x−y..]

    匹配 x~y 范围中的任意单一字符

    [0-9], [A-Za-z]

    [^…]

    不匹配此字符集中出现的任何一个字符,包括某一范围的字符(如果在此字符集中出现)

    [^aeiou], [^A-Za-z0-9]

    (*|+|?|{})?

    用于匹配上面频繁出现/重复出现符号的非贪婪版本(*、+、?、{})

    .*?[a-z]

    (…)

    匹配封闭的正则表达式,然后另存为子组

    ([0-9]{3})?,f(oo|

    \d

    匹配任何十进制数字,与[0-9]一致(\D 与\d 相反,不匹配任何非数值型的数字)

    data\d+.txt

    \w

    匹配任何字母数字字符,与[A-Za-z0-9_]相同(\W 与之相反)

    [A-Za-z_]\w+

    \s

    匹配任何空格字符,与[\n\t\r\v\f]相同(\S 与之相反)

    of\sthe

    \b

    匹配任何单词边界(\B 与之相反)

    \bThe\b

    \N

    匹配已保存的子组 N(参见上面的(…))

    price: \16

    \c

    逐字匹配任何特殊字符 c(即,仅按照字面意义匹配,不匹配特殊含义)

    \., \\, \*

    \A(\Z)

    匹配字符串的起始(结束)(另见上面介绍的^和$)

    \ADear

    举几个例子:

    1 匹配以字母a开头,以字母b结束的中间为任意1个数字

    表达式=’^a[0-9]b$’

    1. sr2 = 'a2b'
    2. sr3='acb'
    3. print(re.findall('^a[0-9]b$',sr2))
    4. print(re.findall('^a[0-9]b$',sr3))
    5. #打印结果 字符串sr2符合要求
    6. ['a2b']
    7. []

    2 匹配字母s或者字母c出现1到3次

    表达式='[s|c]{1,3}'

    1. sr4 = 'a2bsbccs233scacss'
    2. print(re.findall('[s|c]{1,3}',sr4))

    3 匹配字母c和f之前的任意字符

    表达式=‘c.*f’

    1. sr5='acdfdfb'
    2. print(re.findall('c.*f',sr5))
    3. 打印结果:
    4. ['cdfdf']

    re模块

    安装完python后通过import re直接导入使用

    re常用函数有match(),search(),findall(),finditer(),split()

    findall()函数

    findall()函数匹配正则表达式,匹配所有符合条件的数据,并返回一个列表,匹配不上返回为空列表,上面已经有举例,不在次多做介绍。

    finditer()函数

    finditer()函数与 findall()函数相同,但返回的不是一个列表,而是一个迭代器。对于每一次匹配,迭代器都返回一个match匹配对象

    1. sr = '看025-2322222,设定023-32322,噢00哦30哦0290231312312'
    2. #打印匹配的结果
    3. print(re.finditer('\d{3}-\d{7}',sr))
    4. #打印list()函数将迭代器转换为列表并打印
    5. print(list(re.finditer('\d{3}-\d{7}',sr)))
    6. #循环迭代器,将match对象通过group()函数打印匹配到内容
    7. for i in re.finditer('\d{3}-\d{7}',sr):
    8. if i is not None:
    9. print(i.group())
    10. else:
    11. print('未匹配到对象')
    1. #结果为迭代器
    2. <callable_iterator object at 0x108daa380>
    3. #每个list元素为match对象
    4. [<re.Match object; span=(8, 19), match='025-2322222'>]
    5. #打印match对象的内容
    6. 025-2322222

    match()函数

    match()尝试从字符串的起始部分对模式进行匹配。如果匹配成功,返回一个匹配对象;如果匹配失败,返回 None; 匹配对象的 group()方法用于显示成功的匹配。

    1. sr6 = 'a2bsbccs233scacss'
    2. #表达式‘a{1,3}’从起始位置可以匹配成功
    3. print(re.match('a{1,3}',sr6))
    4. #表达式‘2b.*’从起始位置不能匹配成功
    5. print(re.match('2b.*',sr6))
    6. 打印结果: 第一个可以匹配,第二个为None
    7. <re.Match object; span=(0, 1), match='a'>
    8. None

    通过group()方法获取匹配到的内容

    print(re.match('a{1,3}',sr6).group())
    

    search()函数

    search()方法会在任意位置搜索正则表达式第一次出现的匹配情况(即使可以匹配到多个,也只会获取第一次匹配到的数据)。如果搜索到成功的匹配,会返回一个匹配对象;否则,返回 None。

    1. 比如上面的例子
    2. sr6 = 'a2bsbccs233scacss'
    3. print(re.search('233.*',sr6).group())
    4. #打印结果
    5. 233scacss

    虽然从字符串一开始匹配不到,但是通过搜索在中间位置可以找到匹配的对象,然后通过group()方法获取匹配到的内容。

    在正则表达式中加入括号(),进行分组,获取分组内的内容。

    比如下面表达式'233(.*)c(.*)',添加了两个分组,通过group(1)和group(2)获取相应内容

    1. print(re.search('233(.*)c(.*)',sr6).group(1))
    2. print(re.search('233(.*)c(.*)',sr6).group(2))
    3. #打印结果
    4. sca
    5. ss

    split()函数

    split()函数在正则表达式匹配到内容后,将其他未匹配的内容分割为列表,可支持最大分割次数,类似与字符串str.split()方法。

    1. sr7 = '1234a2344b555556d556677'
    2. #将匹配到字母以为的其他内容分割为一个列表
    3. print(re.split('[a-z]',sr7))
    4. #打印结果
    5. ['1234', '2344', '555556', '556677']

    参数添加maxsplit次数后

    1. print(re.split('[a-z]',sr7,maxsplit=2))
    2. #打印结果
    3. ['1234', '2344', '555556d556677']

    ----感谢读者的阅读和学习,谢谢大家。

    共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

    -----指水滴不断地滴,可以滴穿石头;

    -----比喻坚持不懈,集细微的力量也能成就难能的功劳。

  • 相关阅读:
    MYSQL数据库之备份与恢复
    JUNIT使用和注意、以及断言的介绍使用、SpringBoot Test测试类的使用、maven配置使用junit详细介绍
    Css 如何取消a链接点击时的背景颜色
    VUE 笔记 基础语法篇
    java毕业设计研究生实验室综合管理系统Mybatis+系统+数据库+调试部署
    React之使用脚手架启动页面
    Java 异常处理通关指南
    java计算机毕业设计ssm+jsp计算机视频学习网站
    如何解决git clone http/https仓库失败(403错误)
    用BFS求最短路 - 习题6道
  • 原文地址:https://blog.csdn.net/kymppcds/article/details/133999422