python 自动化数据提取之正则表达式
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
>>>> 前 言
我们在做接口自动化的时候处理接口依赖的相关数据时通常会使用正则表达式来进行提取相关的数据今天在这边和大家聊聊如何在python中使用正则表达式。
正则表达式又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法英语Regular Expression在代码中常简写为regex
、regexp
或RE是计算机科学的一个概念。
正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。按某种规则匹配的表达式被称之为正则表达式在python使用正则表达式可以使用官方库re来实现学习re模块之前我们先来了解一下正则表达式的基本语法。
>>>> 正 则 表 达 式 语 法
1、表示单字符
单字符即表示一个单独的字符比如匹配数字用\d ,匹配非数字使用\D具体规则如下
字符 | 功能 |
---|---|
. | 匹配任意1个字符除了\n |
[7a ] | 匹配[ ]中列举的字符这里就是匹配7或者a这两个字符其中的一个 |
\d | 匹配数字即0-9 |
\D | 匹配非数字即不是数字 |
\s | 匹配空白即 空格tab键 |
\S | 匹配非空白 |
\w | 匹配单词字符即a-z、A-Z、0-9、_ |
\W | 匹配非单词字符 |
如果你想学习接口自动化测试我这边给你推荐一套视频这个视频可以说是B站播放全网第一的接口自动化测试教程同时在线人数到达1000人并且还有笔记可以领取及各路大神技术交流798478386
2、表示数量
如果要匹配某个字符多次就可以在字符后面加上数量进行表示具体规则如下
字符 | 功能 |
---|---|
* | 匹配前一个字符出现0次或者无限次即可有可无 |
+ | 匹配前一个字符出现1次或者无限次即至少有1次 |
? | 匹配前一个字符出现1次或者0次即要么有1次要么没有 |
{m} | 匹配前一个字符出现m次 |
{m,} | 匹配前一个字符至少出现m次 |
{m,n} | 匹配前一个字符出现从m到n次 |
3、表示边界
字符 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\b | 匹配单词的边界 |
\B | 匹配非单词边界 |
4、匹配分组
字符 | 功能 | |||
---|---|---|---|---|
| | 匹配左右任意一个表达式 | |||
(ab) | 将括号中字符作为一个分组 | |||
\num | 引用分组num匹配到的字符串 | |||
(?P<name>) | 分组起别名 | |||
(?P=name) | 引用别名为name分组匹配到的字符串 |
5、贪婪模式
贪婪模式Python里数量词默认是贪婪的总是尝试匹配尽可能多的字符
如下案例有一个字符串s,我们需要在字符串中匹配3个以上的数字字符串中数字有8个贪婪模式会尽可能匹配更多字符3个以上8个也是3个以上那么这里匹配的结果就是8个数字。
非贪婪模式总是尝试匹配尽可能少的字符在"*","?","+",""后面加上可以关闭贪婪模式
关闭贪婪模式之后尽可能获取更少的如下只获取到最前面的3个数值至少3个非贪婪就是最前面的3个
>>>> r e 模 块 的 使 用
在python中使用正则表达式需要用到re模块来进行操作这边给大家介绍几个re模块中常用的方法。
1、re.match函数
-
参数说明接收两个参数
-
第一个是匹配的规则
-
第二个是匹配的目标字符串
-
-
re.match尝试从字符串的起始位置匹配一个模式匹配成功 返回的是一个匹配对象这个对象包含了我们匹配的信息如果不是起始位置匹配成功的话match()返回的就是空。
2、re.search 方法
-
参数说明接收两个参数
-
第一个是匹配的规则
-
第二个是匹配的目标字符串
-
-
re.search 扫描整个字符串并返回第一个成功的匹配。
re.match与re.search的区别
-
re.match从字符串的开始位置进行匹配如果字符串开始不符合正则表达式则匹配失败函数返回空
-
而re.search匹配整个字符串直到找到一个匹配成功的则进行返回如果整个字符串中都没有找到匹配成功的则返回空。
3、findall 方法
-
参数说明接收两个参数
-
第一个是匹配的规则
-
第二个是匹配的目标字符串
-
-
在字符串中找到正则表达式所匹配的所有子串并返回一个列表如果没有找到匹配的则返回空列表。
注意match 和 search 是匹配一个结果 findall 匹配处所有符合规则的结果。
4、sub 方法
替换字符串中的某些字符可以用正则表达式来匹配被选子串。
re.sub(pattern, repl, string, count=0 )
-
参数
-
pattern匹配的规则
-
repl匹配之后替换的新内容
-
string需要按规则替换的字符串
-
count替换的次数可以不传参默认替换所有符合规则的。
-
>>>> 案 例 演 示
需求整个正则表达式提取如下接口登录之后返回的token值。
接口地址http://47.112.233.130/users/login/
请求参数
返回结果
{'refresh': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTY1Mzk4MzMyNSwiaWF0IjoxNjUzODk2OTI1LCJqdGkiOiI2NTE2MTE0OGFhMDY0NWNjYWY2ZWE4YmYzYzY1YjE1ZSIsInVzZXJfaWQiOjJ9.fMkJfOdhczbr1MqvYE5b0qYlC5GewBlFZbrteMOLUv0', 'token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjUzOTgzMzI1LCJpYXQiOjE2NTM4OTY5MjUsImp0aSI6ImQ3Nzg1ZjY0YTk2YzQwYzliZDcwMmUxMDgzNjVkNWU5IiwidXNlcl9pZCI6Mn0.UNmLRQsXnZBltgL7QQVuBON2UEBQav87NSGy5Iqbnws'}
实现代码
import requests
import re
# 登录接口
login_url = 'http://47.112.233.130:8888/users/login/'
# 请求登录接口进行登录
params = {
"username": "test",
"password": "123456"
}
response = requests.post(url=login_url, json=params)
#使用正则表达式提取token
result = re.search(r'token":"(.+?)"',response.text)
token = result.group(1)
上述案例中关于token的提取我们使用的是正则表达式除了正则之外进行数据提取还有很多方式可以实现比如jsonpath,xpath等等。jsonpath只能在接口返回的是json格式数据的情况下使用xpath适用于接口返回的是XML或者HTML时使用。