21.Python之re模块

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)
      
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容

  • 常用模块 认识模块 什么是模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文...
    go以恒阅读 2,014评论 0 6
  • 类 !/usr/bin/python -- coding: UTF-8 -- class Employee:'所有...
    SkTj阅读 997评论 0 0
  • 正则表达式、re模块、匹配单个字符、匹配多个字符、匹配开头结尾、匹配分组、re模块的高级用法、python贪婪和非...
    Cestine阅读 1,543评论 0 1
  • 一、破解密码 1. 排列 代码演示:import itertools#1。排列 1,2,3 # 从n个不同的...
    陈small末阅读 270评论 0 0
  • 一.RE 模块 RE 指的是 正则表达式 (就是一些带有特殊含义的符号或者符号的组合) 它的作用是对字符串进行过滤...
    knot98阅读 167评论 0 0