当前位置 博文首页 > 正则表达式+Python re模块详解

    正则表达式+Python re模块详解

    作者:YxinMiracle 时间:2021-08-24 18:58

     正则表达式(Regluar Expressions)又称规则表达式,在代码中常简写为REs,regexes或regexp(regex patterns)。它本质上是一个小巧的、高度专用的编程语言。 通过正则表达式可以对指定的文本实现
    匹配测试、内容查找、内容替换、字符串分割 等功能。

    re模块介绍

    Python中的re模块提供了一个正则表达式引擎接口,它允许我们将正则表达式编译成模式对象,然后通过这些模式对象执行模式匹配搜索和字符串分割、子串替换等操作。re模块为这些操作分别提供了模块级别的函数以及相关类的封装。

    正则表达式一些小规则

        ①元字符

      ②量词

    ③贪婪和非贪婪匹配

        总是在量词范围内尽量多匹配 - 贪婪
        总是在量词范围内尽量少匹配 - 惰性
        .*?x 匹配任意内容任意次数 遇到x就停止
        .+?x 匹配任意内容至少1次 遇到x就停止

        ④转义符问题

        . 有特殊的意义,取消特殊的意义\
        取消一个元字符的特殊意义有两种方法
        在这个元字符前面加 \
         对一部分字符生效,把这个元字符放在字符组里
        [.()+?*]

    Python --> re模块

    findall
            会优先显示分组内的内容
            *****取消优先显示(?:正则)
    search
            只能返回第一个符合条件的项
            得到的结果需要.group取值
            默认获取完整的匹配结果
            通过group(n)取第n个分组中的内容

    # search 还是按照完整的正则进行匹配,显示也显示匹配到的第一个内容,但是我们可以通过给group方法传参数
    # 来获取具体文组中的内容
    ret = re.search('9(\d)(\d)','19740ash93010uru')
    print(ret) # 变量 -- > <re.Match object; span=(1, 4), match='974'>
    if ret:
      print(ret.group()) # --> 974
      print(ret.group(1)) # --> 7
      print(ret.group(2)) # --> 4
    
    # findall
      # 取所有符合条件的,优先显示分组中的
    # search 只取第一个符合条件的,没有优先显示这件事儿
      # 得到的结果是一个变量
        # 变量.group() 的结果 完全和 变量.group(0)的结果一致
        # 变量.group(n) 的形式来指定获取第n个分组中匹配到的内容
    
    # 加上括号 是为了对真正需要的内容进行提取
    ret = re.findall('<\w+>(\w+)</\w+>','<h1>askh930s02391j192agsj</h1>')
    print(ret) # --> ['askh930s02391j192agsj']

        其他的内容在代码中有详细的注释,大家可以复制我的代码一步一步运行然后实验

        以下的内容有:split sub subn math,compile,finditer

    # split sub subn math,compile,finditer
    # split
    res = re.split('\d+', "cyx123456cyxx")
    print(res) # --> ['cyx', 'cyxx']
    res = re.split('(\d+)', "cyx123456cyxx") # 保留分组
    print(res) # --> ['cyx', '123456', 'cyxx']
    # sub 替换
    res = re.sub('\d+', '我把数字替换了',
           "cyx123456cyxxx123456") # 默认全部替换,当然也可以替换一次re.sub('\d+','我把数字替换了',"cyx123456cyxxx123456",1)
    print(res) # --> cyx我把数字替换了cyxxx我把数字替换了
    # subn 替换了并显示替换的次数
    res = re.subn('\d+', '我把数字替换了', "cyx123456cyxxx123456")
    print(res) # --> ('cyx我把数字替换了cyxxx我把数字替换了', 2)
    # match 这个就相当与加了个^ (和search差不多) --> 主要用来规定这个字符号必须是什么样的
    res = re.match('\d+', 'cyx123456cyxxx')
    print(res) # --> None
    res = re.match('\d+', '123cyx456cyxxx')
    print(res.group()) # --> 123
    # compile -- 节省代码的时间的工具
    # 假如同一个正则表达式要被使用多次
    # 节省了多次解析同一个正则表达式的时间
    ret = re.compile("\d+")
    res = ret.search("cyx12456cyxXX123")
    print(res.group()) # --> 12456
    # finditer --> 节省空间
    ret = re.finditer("\d+", "cyx123456cyxxx125644")
    for r in ret:
      print(r.group()) # --> 123456
      # 125644
    # 怎么又节省时间又节省空间呢?
    ret = re.compile('\d+')
    res = ret.finditer("cyx222231fddsf45746sdf2123sdf56456sdf10123sdf123132sdf")
    for r in res:
      print(r.group())
    """
    222231
    45746
    2123
    56456
    10123
    123132
    """
    # 分组命名(?P<组名>正则) (?P=组名)
    # 有的时候我们要匹配的内容是包含在不想要的内容之中的,
    # 只能先把不想要的内容匹配出来,然后再想办法从结果中去掉
    # 分组命名的用法 (找两个组里面是一样的内容)
    exp = '<abc>asdasf54545645698asdasd</abc>00545sdfsdf</abd>'
    ret = re.search('<(?P<tag>\w+)>.*?</(?P=tag)', exp)
    print(ret) # -- > <re.Match object; span=(0, 33), match='<abc>asdasf54545645698asdasd</abc'>
    # exp2:
    import re
    ret = re.search('\d(\d)\d(\w+?)(\d)(\w)\d(\d)\d(?P<name1>\w+?)(\d)(\w)\d(\d)\d(?P<name2>\w+?)(\d)(\w)',
            '123abc45678agsf_123abc45678agsf123abc45678agsf')
    print(ret.group('name1')) # -- > agsf_123abc
    print(ret.group('name2')) # -- > agsf

    今日小思考

        当我们有一个这样的列表:

    lis = ['', 'z', 'c', 'asd', 'sdf', '', 'asd']

        那么我们如何将里面的空字符删除呢?

    ret = filter(lambda n: n, lis)
    print(list(ret)) # --> ['z', 'c', 'asd', 'sdf', 'asd']

    总结

    jsjbwy
    下一篇:没有了