阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

正则表达式高级用法

109次阅读
没有评论

共计 2615 个字符,预计需要花费 7 分钟才能阅读完成。

一、正则高级用法

1、分组

  • 概念

    处理简单的判断是否匹配之外,正则表达式还有提取子串的功能,用 () 表示的就是要提取的分组

  • 代码

    import re ret = re.search(r"(?P<phone>(?P<quhao>0\d{2,3})-(\d{7,8}))", "zutuanxue_com's phone is 010-88888888") print(ret) # 组的排序:从外到内,从左到右 print(ret.group(0)) # 组中下标为 0 的表示原数据 print(ret.group("phone")) print(ret.group(1)) print(ret.group("quhao")) # 可以根据组的名字获取组的数据 print(ret.group(2)) print(ret.group(3)) # 查看匹配的各组的数据 print(ret.groups())
  • 说明

    • 正则表达式中定义了组,就可以在 Match 对象上用 group()方法提取出子串来
    • group(0)永远是原始字符串,group(1)、group(2)……表示第 1、2、……个子串

2、编译

  • 概念

    当在 python 中使用正则表达式时,re 模块会做两件事,一件是编译正则表达式,如果表达式的字符串本身不合法,会报错。另一件是用编译好的正则表达式提取匹配字符串

  • 编译优点

    如果一个正则表达式要使用几千遍,每一次都会编译,出于效率的考虑进行正则表达式的编译,就不需要每次都编译了,节省了编译的时间,从而提升效率

  • compile()函数

    • 原型

      def compile(pattern, flags=0)
      
    • 作用

      将 pattern 模式编译成正则对象

    • 参数

      参数 说明
      pattern 匹配的正则表达式(一种字符串的模式)
      flags 标识位,用于控制正则表达式的匹配方式
    • flags

      说明
      re.I 是匹配对大小写不敏感
      re.L 做本地化识别匹配
      re.M 多行匹配,影响到 ^ 和 $
      re.S 使. 匹配包括换行符在内的所有字符
      re.U 根据 Unicode 字符集解析字符,影响 \w、\W、\b、\B
      re.X 通过给予我们功能灵活的格式以便更好的理解正则表达式
    • 返回值

      编译好的正则对象

    • 示例

      import re re_phone = re.compile(r"(0\d{2,3}-\d{7,8})") print(re_phone, type(re_phone))
  • 编译后其他方法的使用

    原型

    def match(self, string, pos=0, endpos=-1)
    def search(self, string, pos=0, endpos=-1)
    def findall(self, string, pos=0, endpos=-1)
    def finditer(self, string, pos=0, endpos=-1)
    

    参数

    参数 说明
    string 待匹配的字符串
    pos 从 string 字符串 pos 下标开始
    endpos 结束下标

    示例

    s1 = "zutuanxue_com's phone is 010-88888888" s2 = "kaige's phone is 010-99999999" ret1 = re_phone.search(s1) print(ret1, ret1.group(1)) ret2 = re_phone.search(s2) print(ret2, ret2.group(1))

3、贪婪匹配

  • 贪婪概念

    匹配尽可能多的字符

    import re print(re.findall(r"(\d+0)", "12340567085465046567"))
  • 非贪婪概念

    尽可能少的匹配称为非贪婪匹配,*?、+? 即可

    import re print(re.findall(r"(\d+?0)", "12340567085465046567"))
  • 常见示例

    /* part1 */ /* part2 */

    import re s = '''/* zutuanxue_com good */ dsdgergaergser /* kaige nice */''' print(re.findall(r"/\* (.*) \*/", s)) print(re.findall(r"/\* (.*?) \*/", s))

二、高级使用

1、字符串切割

  • 早期字符串切割代码

    s1 = "zutuanxue_com is a good man" print(s1.split(" "))
  • 现在的需求

    字符串 ”zutuanxue_com is a good man” 中的单词切割出来(注意字符串中空格个数不定)

  • 正则中的 split()函数

    原型:re.split(pattern, string)

    作用:切割字符串

  • 解决需求

    import re s2 = "zutuanxue_com is a good man" print(re.split(r"\s+", s2))
  • 切割 ”zutuanxue_com#is$a%good&man” 中的单词

    import re s3 = "zutuanxue_com#is$a%good&man" print(re.split(r"[#$%&]", s3))

2、字符串替换

  • 早期字符串替换代码

    s1 = "zutuanxue_com is a good man" s2 = s1.replace("good", "nice") print(s2)
  • 现在的需求

    将字符串 ”zutuanxue_com is a good man!zutuanxue_com is a nice man!zutuanxue_com is a cool man” 中的 ”good”、“nice”、“cool” 都改为 ”handsome”

  • sub 函数与 subn()函数

    • 原型

      def sub(pattern, repl, string, count=0, flags=0)
      def subn(pattern, repl, string, count=0, flags=0)
      
    • 作用

      在目标字符串 string 中查找匹配的 pattern 模式的字符串,再把它们替换成指定 repl 字符串,可以指定最多替换 count 次,否则替换所有

    • 区别

      a、sub 返回一个替代后的字符串

      b、subn 返回一个元组,元组的第一个元素为替换后的字符串,第二个元素为替换的次数

  • 解决需求

    import re s3 = "zutuanxue_com is a good man!zutuanxue_com is a nice man!zutuanxue_com is a cool man" print(re.sub(r"good|nice|cool", "handsome", s3)) print(re.subn(r"good|nice|cool", "handsome", s3))

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-05-26发表,共计2615字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中