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)
      
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

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