21.Python之re模块

作者: 免跪姓黄 | 来源:发表于2020-02-23 10:27 被阅读0次

    Python之re模块

    1. re模块介绍

      • re 模块使 Python 语言拥有全部的正则表达式功能。
    2. re模块的内置方法

      • re.findall()

        对字符串进行正则表达式的全文匹配,把所有符合正则表达式的结果以列表的形式返回,如果正则表达式中有分组,虽然匹配的时候按照正则表达式进行匹配的,但是只返回分组中的正则内容。

        import requests
        s = '<h1>Python之re模块findall方法</h1>'
        # 通过正则只取出结果:'Python之re模块findall方法'
        ret = re.findall('<h1>(.*?)</h1>',s)    # 有分组()时,返回结果只会显示分组内容
        print(ret)  # ['Python之re模块findall方法']
        
      • re.search()

        对字符串进行正则表达式的全文匹配,只取第一个符合正则表达式条件的结果,得到的结果是一个变量,通过.group(n)可以获取到第n个分组中匹配到的内容。主要用来寻找字符串中是否含有满足条件的子内容。

        import requests
        s = '4-2*(4+6)'
        # 通过正则计算s中4+6的值
        ret = re.search('(\d+)[+](\d+)',s)
        ret_1 = int(ret.group(1))
        ret_2 = int(ret.group(2))
        print(ret_1 + ret_2)
        
      • re.split()

        以正则表达式为条件,切分字符串内容,并将内容以列表的形式返回。若正则表达式中有分组,则保留匹配的切分条件。

        # 不含分组
        import re
        s = '54Python432re78split'
        ret = re.split('\d+',s)
        print(ret, type(ret))   # ['', 'Python', 're', 'split'] <class 'list'>
        
        # 含有分组
        import re
        s = '54Python432re78split'
        ret = re.split('(\d+)',s)
        print(ret, type(ret))    # ['', '54', 'Python', '432', 're', '78', 'split'] <class 'list'>
        
      • re.sub()

        以正则表达式为条件,用指定的字符串替换符合正则表达式内容的字符串,并且可以指定替换的次数。

        # 不指定替换次数,默认全部替换
        import re
        s = 'Python432re78sub'
        ret = re.sub('\d+', '_', s)
        print(ret, type(ret))   # Python_re_sub <class 'str'>
        
        # 指定替换次数
        import re
        s = 'Python432re78sub'
        ret = re.sub('\d+', '_', s, 1)  # 指定替换次数1
        print(ret, type(ret))   # Python_re78sub <class 'str'>
        
      • re.subn()

        以正则表达式为条件,用指定的字符串替换符合正则表达式内容的字符串,并且统计出替换的次数,并以元组的形式返回结果。

        import re
        s = 'Python432re78sub'
        ret = re.subn('\d+', '_', s)
        print(ret, type(ret))   # ('Python_re_sub', 2) <class 'tuple'>
        
      • re.math()

        从开头进行匹配,相当于添加了^,使用方法同search()。一般用来规定用户输入信息必须是什么样的。

        import re
        while 1:
            user_input = input('请输入您的手机号:').strip()
            # 要求用户输入的手机好必须是第一位是1开头,第二位是3到9的11位数字
            ret = re.match('1[3-9]\d{9}', user_input)
            if re.match('1[3-9]\d{9}', user_input) == None:
                print('请输入合法的手机号')
            else:
                break
        
      • re.compile()

        可以将正则表达式一次编译多次使用,避免重复编译正则表达式。是一个提升代码执行效率的工具。

        import requests
        s_1 = '<h1>page1</h1>'
        s_2 = '<h1>page2</h1>'
        s_3 = '<h1>page3</h1>'
        ret = re.compile('<h1>(.*?)</h1>')
        res_1 = ret.findall(s_1)
        res_2 = ret.findall(s_2)
        res_3 = ret.findall(s_3)
        print(res_1)
        print(res_2)
        print(res_3)
        
      • re.finditer()

        不同于re.findall()直接返回一个列表,re.finditer()返回的是一个迭代器,通过迭代器一个一个的取值,可以节省内存空间。

        import requests
        s = '477h314kh3h532kjh589kjh523h5kj2h3jh6957kj4h6kj'
        ret = re.finditer('\d+',s)
        for i in ret:
            print(i.group())
        

      在爬虫中re.compile()经常与re.finditer()连用。即能节省时间,也能节省空间。

    3. re模块的使用

      • 分组命名

        当正则表达式中存在很多个分组,为避免对分组取值时一个一个的去数分组的情况发生,一般都会给分组进行命名,命名的方法实在括号内的最前面添加(?P<分组的名称>)

        import requests
        s = '477h314kh3h532kjh589'
        ret = re.search('(?P<取数字>\d+)(?P<取字母>\w+?)',s)
        print(ret.group('取数字'))    # 477
        print(ret.group('取字母'))    # h
        
      • 分组的引用

        当正则表达式中的两个分组内容相同,可以通过分组名称进行分组内容的引用,注意,通过分组名称引用的并不是正则表达式,而是正则表达式匹配的内容。

        import re
        s = '<h1>Python之re模块findall方法</h1>'
        ret = re.search('<(?P<tag>\w+)>(.*?)</(?P=tag)>',s)
        print(ret)
        
        # 正则表达式中的\1表示第一个分组,因此也可以写成
        import re
        s = '<h1>Python之re模块findall方法</h1>'
        ret = re.search(r'<(?P<tag>\w+)>(.*?)</\1>',s)
        print(ret)
        

    相关文章

      网友评论

        本文标题:21.Python之re模块

        本文链接:https://www.haomeiwen.com/subject/mfwdqhtx.html