正则表达式常用方法

前言:作为测试工程师,在工作中经常需要处理字符串,比如自动化测试过程中,在参数关联的时候就需要去响应结果中提取一些全局参数。如果参数是规则的 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

posted @ 2022-01-22 12:06  晨起的太阳  阅读(273)  评论(0编辑  收藏  举报