• 正则表达式常用方法


    前言:作为测试工程师,在工作中经常需要处理字符串,比如自动化测试过程中,在参数关联的时候就需要去响应结果中提取一些全局参数。如果参数是规则的 JSON 数据,我们可以使用 jsonpath 提取,如果参数为不规则的字符串,这个时候正则表达式便是最好的选择。一提到正则很多同学第一反应是很复杂,实际上正则功能很强大,但是对于我们测试测试工程师而言,我们只需要掌握一些常见的用法即可。下面我么就来看一下正则表达式有哪些常用的方法。

    一、正则表达式作用

    • 匹配指定规则的字符串

    二、常用方法

    • findall():RE 匹配的所有子串,并把它们作为一个列表返回

      """
      findall():RE 匹配的所有子串,并把它们作为一个列表返回
      """
      res=re.findall('www','www.baidu.www.com')
      print(res)
      输出:['www', 'www']

    • match():RE 是否在字符创开始的位置匹配(只匹配开始位置),如果不是起始位置匹配成功的话,match()就返回 none

      匹配起始位置为 www,非其实位置返回 None,group()返回 re 匹配的字符串
      res = re.match('www','www.baidu.com').group()
      print(res)
      输出:www

    • search():RE 扫描整个字符串并返回第一个成功的匹配

      在'www.baidu.com'中匹配'www',返回匹配到的第一个
      result = re.search('www','www.baidu.com').group()
      print(result)
      输出:www

    • finditer():RE 匹配的所有子串,并把它们作为一个迭代器返回

      """
      finditer():匹配所有找到的子串,返回一个可迭代对象
      """
      res = re.finditer('www','www.baidu.www.com')
      print(res)
      for i in res:
      print(i.group())
      输出:
      <callable_iterator object at 0x10e6df8d0>
      www
      www

    • 结果处理函数
      • group():返回 RE 匹配的字符串
      • span():返回匹配到字符串开始索引位置和结束索引位置的元组(开始,结束)
    • start():返回匹配到字符串的开始索引位置

    • end():返回匹配到字符串的结束索引位置

    • sub():替换字符串,返回替换后的字符串

      """
      sub():替换字符串,返回替换后的字符串
      """
      res3=re.sub('\d+','我把数字替换了','www.5555.com')
      print(res3)
      输出:www.我把数字替换了。com

    • subn():替换字符串,返回替换后的字符串,和替换次数

      """
      subn():替换字符串,返回替换后的字符串,和替换次数
      """
      res = re.subn('\d+','我把数字替换了','www.5555.com')
      print(res)
      输出:('www.我把数字替换了。com', 1)

    • split():切割,根据某个字符切割(根据 +,-,*,\ 切割 su 这个字符串,+-*有特殊意义需要反斜杠转义)

      """
      根据。进行切割,特殊意义的字符需要通过反斜杠()进行转义
      """
      res2 = re.split('.','www.baidu.com')
      print(res2)
      输出:['www', 'baidu', 'com']

    三、正则匹配分类

    • 单字符匹配【 每次只匹配一个字符】
      元字符描述
      . 匹配任意一个字符(除了\n),匹配多次每次匹配一个字符,返回匹配结果的 list【匹配\n 时会报错】
      [ ] 匹配[ ]中列举的任意一个字符 【匹配[ ]中的任何一个字符】
      \d 匹配数字,即 0-9
      \D 匹配非数字,即不是数字
      \s 匹配空白,即 空格,tab 键 【都是空白】
      \S 匹配非空白
      \w 匹配非特殊字符,即 a-z、A-Z、0-9、_、汉字
      \W 匹配特殊字符,即非字母、非数字、非汉字 【非下划线】
      • 代码演示
        • . 匹配任意一个字符(除了\n),匹配多次每次匹配一个字符,返回匹配结果的 list

        """
        .:匹配任意一个字符(除了\n),匹配多次每次匹配一个字符,返回匹配结果的 list
        需求:获取 h 开头的 2 个字符
        """
        匹配 h 开头的任意 2 个字符
        res='h.'
        ss='hello python'
        result = re.findall(res,ss)
        print(result)
        输出:['he', 'ho']

        • [ ]:匹配[ ]中列举的任意一个字符 【匹配[ ]中的任何一个字符】

          """
          []:匹配[ ]中列举的任意一个字符 【匹配[ ]中的任何一个字符】
          需求:获取 heo
          """
          匹配 heo 中任意一个
          res='[heo]'
          ss='hello python'
          result = re.findall(res,ss)
          print(result)
          输出:['h','e','o','o']

        • \d:匹配数字,即 0-9

          """
          \d:匹配数字,即 0-9
          需求:匹配所有的数字
          """
          匹配数字
          res='\d'
          ss='he4l5lo1pyt0h3on5'
          result = re.findall(res,ss)
          print(result)
          输出:['4', '5', '1', '0', '3', '5']

        • \D:匹配非数字,即不是数字

          """
          \D:匹配非数字,即不是数字
          需求:匹配非数字
          """
          匹配非数字
          res='\D'
          ss='he4l5lo1pyt0h3o&n5'
          result = re.findall(res,ss)
          print(result)
          输出:['h', 'e', 'l', 'l', 'o', 'p', 'y', 't', 'h', 'o', '&', '
          ', 'n']

        • \s:匹配空白,即 空格,tab 键 【都是空白】

          """
          \s:匹配空白,即 空格,tab 键 【都是空白】
          """
          匹配空白
          res='\s'
          ss='hello python '
          result = re.findall(res,ss)
          print(result)
          输出:[' ', ' ', ' ', ' ', ' ']

        • \S:匹配非空白

          """
          \S:匹配非空白
          """
          匹配非空白
          res='\S'
          ss='hello python '
          result = re.findall(res,ss)
          print(result)
          输出:['h', 'e', 'l', 'l', 'o', 'p', 'y', 't', 'h', 'o', 'n']

        • \w:匹配非特殊字符,即 a-z、A-Z、0-9、_、汉字

          """
          \w:匹配非特殊字符,即 a-z、A-Z、0-9、_、汉字
          """
          匹配非特殊字符
          res='\w'
          ss='hello 好好学 python'
          result = re.findall(res,ss)
          print(result)
          输出:['h', 'e', 'l', 'l', 'o', '好', '好', '学', 'p', 'y', 't', 'h', 'o', 'n']

        • \W:匹配特殊字符,即非字母、非数字、非汉字 【非下划线】

          """
          \W:匹配特殊字符,即非字母、非数字、非汉字 【非下划线】
          """
          匹配特殊字符
          res='\W'
          ss='hello 好好学 python_-*&^%KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲@' result = re.…', '#', '@']

    • 多字符匹配
      元字符描述
      * 匹配前一个字符出现 0 次或者无限次,即可有可无,【0 次--无限次】【贪婪模式】
      + 匹配前一个字符出现 1 次或者无限次,即至少有 1 次匹配一个字符串【1 次--无限次】;【贪婪模式】
      举例:第一个字符是 t,最后一个字符串是 o,中间至少有一个字符 re.match("t.+o", "two")  
      ? 匹配前一个字符出现 0 次或者 1 次,即要么有 1 次,要么没有,【最多匹配一次】;【非贪婪模式】
      举例:匹配 https re = 'https?'  
      {n} 匹配前一个字符连续出现 n 次
      {m,n} 匹配前一个字符连续出现从 m 到 n 次 【至少出现 m 次,最多出现 n 次】【省略 n,匹配前一个字符中至少出现 m 次】
      • 代码演示

        • *:匹配前一个字符出现 0 次或者无限次,即可有可无

        """
        :匹配前一个字符出现 0 次或者无限次,即可有可无,未匹配到就是空
        """
        匹配 h 出现 0 次或者多次无限次数
        res='h
        '
        ss='hello 好好学 python_-*&^%$#@'
        result = re.findall(res,ss)
        print(result)
        输出:['h', '', '', '', '', '', '', '', '', '', '', 'h', '', '', '', '', '', '', '', '', '', '', '', '']

        • +:匹配前一个字符出现 1 次或者无限次,即至少有 1 次匹配一个字符串
          """
          +:匹配前一个字符出现 1 次或者无限次,即至少有 1 次匹配一个字符串
          贪婪模式
          """
          匹配 o 至少出现 1 次或者多次
          res='ho+'
          ss='hello python hoo'
          result = re.findall(res,ss)
          print(result)
          输出:['ho', 'hoo']
        • ?:匹配前一个字符出现 0 次或者 1 次,即要么有 1 次,要么没有
          """
          ?:匹配前一个字符出现 0 次或者 1 次,即要么有 1 次,要么没有
          """
          匹配 o 出现零次或者一次
          res='ho?'
          ss='hello python hoo'
          result = re.findall(res,ss)
          print(result)
          输出:['h', 'ho', 'ho']
        • {n}:匹配前一个字符连续出现 n 次
          """
          {n}:匹配前一个字符连续出现 n 次
          """
          匹配 l 连续出现 2 次
          res='hel{2}'
          ss='hello python helll'
          result = re.findall(res,ss)
          print(result)
          输出:['hell', 'hell']
        • {m,n}:匹配前一个字符连续出现从 m 到 n 次
          """
          {m,n}:匹配前一个字符连续出现从 m 到 n 次
          """
          匹配 l 连续出现 2-4 次
          res='hel{2,4}'
          ss='hello python helll hellllll'
          result = re.findall(res,ss)
          print(result)
          输出:['hell', 'helll', 'hellll']
    • 逻辑运算
      元字符描述
      将两个匹配条件进行逻辑“或”(or)运算

      """
      |:将两个匹配条件进行逻辑“或”(or)运算
      """
      匹配 he 或者 py
      res='he|py'
      ss='hello python helll hellllll'
      result = re.findall(res,ss)
      print(result)
      输出:['he', 'py', 'he', 'he']

    • 边界值(了解)
      元字符描述
      ^ 匹配输入字符串开始位置
      $ 匹配输入字符串结束位置
      • 代码演示
        • ^:匹配输入字符串开始位置
          """
          ^:匹配输入字符串开始位置
          """
          匹配 he 开头的
          res='^heh'
          ss='hello python'
          result = re.findall(res,ss)
          print(result)
          输出:['he']
        • """:匹配输入字符串结束位置
          """
          匹配 on 结尾
          res='on$'
          ss='hello python'
          result = re.findall(res,ss)
          print(result)
    • 匹配分组
      元字符描述
      () 只取括号内的值
      • 代码演示
        匹配 member_id,通过()取出对应的值,去掉井号
        re_str = '#(\w.+?)#'
        ss = '{"member_id":"#member_id#","key2":"val2","bid_id":"#bid_id#"}'
        test_re = re.findall(re_str, ss)
        输出:['member_id', 'bid_id']

    三、多字符匹配模式

    • 贪婪模式:尽可能匹配多个(+)

      """
      尽可能多匹配数字
      """
      ss ='hell123opy456thon'
      res = re.findall(r'\d+',ss)
      print(res)
      输出:['123', '456']

    • 非贪婪模式:尽可能匹配更少的,在数量表达后面加问号(?)

      ss ='hell123opy456thon'
      res = re.findall(r'\d?',ss)
      print(res)
      输出:['', '', '', '', '1', '2', '3', '', '', '', '4', '5', '6', '', '', '', '', '']




    链接:http://testingpai.com/article/1623749763125

  • 相关阅读:
    python3读取chrome浏览器cookies
    python通过Cookie跳过登录验证码
    Python 正则表达式模块 (re) 简介
    python抓取bing主页背景图片
    python的开发环境配置-Eclipse-PyDev插件安装
    Windows环境selenium+Python环境配置
    Java+Jmeter接口测试
    Jmeter接口测试参数化实例图文示例
    Jmeter接口测试实例图文示例
    单元测试-代码覆盖率 EclEmma
  • 原文地址:https://www.cnblogs.com/linyu51/p/15832793.html
Copyright © 2020-2023  润新知