前言
我们在做接口自动化的时候,处理接口依赖的相关数据时,通常会使用正则表达式来进行提取相关的数据。
正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(Regular Expression,在代码中常简写为regex、regexp或RE) 。它是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。而Python 自1.5版本起增加了re模块,它提供 Perl 风格的正则表达式模式。
一、正则表达式语法
1.1表示单字符
单字符:即表示一个单独的字符,比如匹配数字用\d,匹配非数字用\D。
除以下语法,也可以匹配指定的具体字符,可以是1个也可以是多个。
字符 | 功能说明 |
. | 匹配任意1个字符(除了\n) |
[2a] | 匹配[]中括号中列举的字符,如这里就是匹配2或者a这两个字符其中的一个 |
\d | 匹配数字,即0-9 |
\D | 匹配非数字 |
\s | 匹配空白,即空格、tab键(tab键为两个空格) |
\S | 匹配非空白 |
\w | 匹配单词字符,即a-z、A-Z、0-9、_(数字、字母、下划线) |
\W | 匹配非单词字符 |
实例如下,这里先说明一下findall(匹配规则,要匹配的字符串)这个方法是查找所有匹配的数据,以列表的形式返回,后面会在re模块进行详解:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
1.2表示数量
如果要匹配某个字符多次,就可以在字符后面加上数量进行表示,具体规则如下:
字符 | 功能说明 |
* | 匹配前一个字符出现0次或者无限次,即可有可无 |
+ | 匹配前一个字符出现1次或无限次,即至少1次 |
? | 匹配前一个字符出现0次或1次,即要么没有,要么只有1次 |
{m} | 匹配前一个字符出现m次 |
{m,} | 匹配前一个字符至少出现m次 |
{m,n} | 匹配前一个字符出现从m到n次 |
实例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
1.2.1匹配分组
字符 | 功能说明 |
| | 匹配左右任意一个表达式 |
(ab) | 将括号中字符作为一个分组 |
实例如下:
1 2 3 4 5 6 7 8 9 |
|
1.3 表示边界
字符 | 功能说明 |
^ | 匹配字符串开头,只能匹配开头 |
$ | 匹配字符串结尾,只能匹配结尾 |
\b | 匹配一个单词的边界(单词:字母、数字、下划线) |
\B | 匹配非单词的边界 |
实例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
二、贪婪模式
python里数量词默认是贪婪的,总是尝试匹配尽可能多的字符,而非贪婪模式则是尝试匹配尽可能少的字符,在表示数量的表达式后加上问号(?)就可以关闭贪婪模式。
如下例子,匹配2个以上的数字,如果符合条件它会一直匹配到不符合才停止,如其中的34656fya,34656符合2个数字以上,那么它会一直匹配到6为止,如果关闭贪婪模式,那么在满足2个数字时就会停止,最后可以匹配到34、65。
1 2 3 4 5 6 7 8 9 |
|
三、re模块
在python中使用正则表达式,就会用到re模块来进行操作,提供的方法一般需要传入两个参数:
- 参数1: 匹配的规则
- 参数2:要进行匹配的字符串
3.1 re.findall()
查找所有符合规范的字符串,以列表的形式返回。
1 2 3 4 |
|
3.2re.search()
查找第一个符合规范的字符串,返回的是一个匹配对象,可以通过group()将匹配到的数据直接提取出来。
1 2 3 4 5 6 7 |
|
返回的匹配对象中,span为匹配到的数据的下标范围,match则是匹配到的值。
group()参数说明:
- 不传参数:获取的是匹配到的所有内容
- 传入数值:可以通过参数来指定,获取第几个分组中的内容(获取第1个分组,传入参数1,获取第2个分组,传入参数2,依次类推。)
1 2 3 4 5 6 7 8 9 10 |
|
3.3 re.match()
从字符串的起始位置进行匹配,匹配成功则返回匹配到的对象,如果开头的位置不符合匹配的规则,不会继续往后面去匹配,直接返回None。re.match()与re.search()都是只匹配一个,不一样的是,前者只匹配字符串的开头,后者则是会匹配整个字符串,但只获取第一个符合的数据。
1 2 3 4 5 6 7 |
|
3.4re.sub()
检索和替换:用于替换字符串中的匹配项
re.sub()参数说明:
- 参数1:待替换的字符串
- 参数2:目标字符串
- 参数3:要进行替换操作的字符串
- 参数4:可以指定最多替换的次数,非必填(默认替换所有符合规范的字符串)
1 2 3 4 5 6 7 8 |
|
四、用例参数化
在接口自动化测试中,我们的测试数据都是保存在excel中的,有些参数如果写死一个数据,可能换个场景或者换个环境就不能用了,那么切换环境时就需要先把新环境的测试数据准备好,并且能支持去跑我们的脚本,或者把excel的数据修改为适合新环境的测试数据,维护的成本较高。因此就需要把我们的自动化脚本测试数据尽量地参数化,降低维护成本。
我们先看简单版的参数化,以登录为例,登录时用到的账号、密码等信息都可以提取出来放到配置文件,修改数据或更换环境时直接在配置文件中统一修改就可以了。
但如果有多个不同的数据需要参数化呢,每个参数都加个判断去替换数据吗?这样的代码既啰嗦又不好维护,这时re模块就可以用上了,直接看一个实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
注意这里的正则表达式是有使用?关闭贪婪模式的,因为测试数据中可能会需要参数化2个或以上的数据,如果不关闭贪婪模式,它就只能匹配搭配一个数据,举例如下:
1 2 3 4 5 6 7 8 9 10 |
|
另外提到的一个用于临时保存数据的类,这里主要用于保存接口返回的数据,因为有些测试数据是动态变化的,可能要依赖于某个接口,后面的测试用例又需要这些数据,那么我们在接口返回时就可以保存到这个类里作为一个类属性,接着在需要用这个数据的测试用例时,把这个类属性提取出来替换到测试数据中即可。提示:设置属性setattr(对象, 属性名, 属性值),获取属性值getattr(对象, 属性名)。
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】