正则表达式及运用

替换数据中的数据:

①原始替换方式
存在问题:用例中每个需要替换的参数都要调一次replace方法

class Test01:
    id = 10
    name = 'tony'
    data = '0011'
    title = 'OK'

Params = "{'id': '#id#', 'name': '#name#', 'data': '#data#', 'title': '#title#', 'aaa': 111}"
Params = Params.replace('#id#', str(Test01.id))
Params = Params.replace('#name#', str(Test01.name))
Params = Params.replace('#data#', str(Test01.data))
Params = Params.replace('#title#', str(Test01.title))

②正则提取
导入模块:import re
通过正则匹配我们需要的数据
findall:匹配字符串中所有符合规则的数据并以列表形式返回,没匹配返回None

str1 = "asdffds13380036136fdsare"
res = re.findall('\d{11}', str1)
print(res)

在这里插入图片描述

str1 = "asdffds13380036136fdsare13380058742"
res = re.findall('\d{11}', str1)
print(res)

在这里插入图片描述

str1 = "asdffds13380036136fdsare13480058742"
res = re.findall('133\d{8}', str1)
print(res)

在这里插入图片描述

正则表达式语法介绍:

-------------------------单字符(元字符):表示单个字符---------------------------
①\d:表示一个数字

str1 = "asdf12123fsdf"
res = re.findall('\d', str1)
print(res)

在这里插入图片描述
②\D:表示一个非数字

str1 = "asdf12123fs+_$$%^df"
res = re.findall('\D', str1)
print(res)

在这里插入图片描述
③\s:小写s,表示一个空白字符

str1 = "a 12fd d"
res = re.findall('\s', str1)
print(res)

在这里插入图片描述
④\S:大写S,表示一个非空白字符

str1 = "a 12fd d"
res = re.findall('\S', str1)
print(res)

在这里插入图片描述
⑤\w:小写w,表示一个单词字符(数字、字母、下划线)

str1 = "a12d_+*&^"
res = re.findall('\w', str1)
print(res)

在这里插入图片描述
⑥\W:大写W,表示一个非单词字符(非数字、字母、下划线)

str1 = "a12d_+*&^"
res = re.findall('\W', str1)
print(res)

在这里插入图片描述
⑦ .:表示任意字符

str1 = "a12d_+*&^"
res = re.findall('.', str1)
print(res)

在这里插入图片描述
⑧[]:列举匹配的单字符
[1-9]:匹配1-9的数字
[a-z]:匹配a-z的小写字母
[A-Z]:匹配A-Z的大写字母
[0-9a-zA-Z]:匹配0-9、a-z、A-Z
[\u4e00-\u9fa5]:匹配中文字

str1 = "a12456d_+*&^"
res = re.findall('[0-9]', str1)
print(res)

在这里插入图片描述
-------------------------表示数量---------------------------

{n}:表示前一个字符出现n次
{n,}:表示前一次字符出现n次以上,至少n次
{n,m}:表示前一个字符出现n-m次

str1 = "1234aacd112233fdf1234466fdsa123456"
res = re.findall('\d{4,6}', str1)
print(res)

在这里插入图片描述

str1 = "1234aacd112233fdf1234466fdsa123456456789454"
res = re.findall('\d{4,6}', str1)
print(res)

在这里插入图片描述
注:4-6,尽可能会按照6来取,贪婪

若不想贪婪,则用?会按照4次来取

str1 = "1234aacd112233fdf1234466fdsa123456456789454"
res = re.findall('\d{4,6}?', str1)
print(res)

在这里插入图片描述
贪婪模式的应用:

str1 = "{'id': '#id#', 'name': '#name#', 'data': '#data#', 'title': '#title#', 'aaa': 111}"
res = re.findall('#.{1,}?#', str1)
print(res)

在这里插入图片描述
②+:表示一次以上(等同于{1,})
(’#.{1,}?#’, str1)==(’#.+?#’, str1)----常用

③*:表示0次以上

str1 = "123abc"
res = re.findall('\d*', str1)
print(res)

在这里插入图片描述

str1 = "{'id': '#id#', 'name': '#name#', 'data': '#data#', 'title': '#title#', 'aaa': 111}"
res = re.findall('#.*?#', str1)
print(res)

在这里插入图片描述
.*?和.+?均为常用

-------------------------表示边界---------------------------
①字符串边界:
^:表示字符串的开头(起始位置)
$:表示字符串的结尾(终止位置)

s = "123python456java123c++123"
res = re.findall('^123', s)
print(res)

在这里插入图片描述

s = "123python456java123c++123"
res = re.findall('123$', s)
print(res)

在这里插入图片描述

s = "1234python456java123c++1234"
res = re.findall('123$', s)
print(res)

在这里插入图片描述

s = "123python456java123c++123"
res = re.findall('123', s)
print(res)

在这里插入图片描述
②单词边界:
\b:表示单词边界
\B:表示非单词边界

s = "python is good?java"
res = re.findall('\bpython', s)
print(res)

在这里插入图片描述
注:\b表示一个转义字符>表示键盘上的backspace

s = "python is good?java"
res = re.findall(r'\bpython', s)
# res = re.findall(r'python\b', s)
print(res)

在这里插入图片描述

s = "pythong ispython99 good?java"
# res = re.findall(r'\Bpython', s)
res = re.findall(r'python\B', s)
print(res)

在这里插入图片描述
-------------------------表示分组---------------------------

s = "{'id': '#id#', 'name': '#name#', 'title': '#title#'}"
res = re.findall('#.+?#', s)
print(res)

在这里插入图片描述

s = "{'id': '#id#', 'name': '#name#', 'title': '#title#'}"
res = re.findall('#(.+?)#', s)
print(res)

在这里插入图片描述

s = "fdsafds#user=kaikai-pwd=123456#fdsafas"
res = re.findall('#user=(.+?)-pwd=(.+?)#', s)
print(res)

在这里插入图片描述

|:管道符,表示多个匹配规则,或的关系

s = "123456python345java000"
res = re.findall('python|java', s)
print(res)

在这里插入图片描述

s = "aaa@python@dfadf#java#and"
res = re.findall('@.+?@|#.+?#', s)
print(res)

在这里插入图片描述
search:匹配并返回第一个符合规则的匹配对象,没匹配到返回None

s = "{'id': '#id#', 'name': '#name#', 'title': '#title#'}"
res = re.search('#(.+?)#', s)
print(res)

在这里插入图片描述
提取陪陪对象中的内容

s = "{'id': '#id#', 'name': '#name#', 'title': '#title#'}"
res = re.search('#(.+?)#', s)
print(res)
print(res.group())
print(res.group(1))

在这里插入图片描述
运用:

import re

class TestData:
    id = 123
    name = 'Tony'
    data = '1122'
    title = '测试数据'
    
s = "{'id': '#id#', 'name': '#name#', 'title': '#title#'}"

while re.search('#(.+?)#', s)
    res2 = re.search('#(.+?)#', s)
    print(res2)
    item = res2.group()
    attr = res2.group(1)
    value = getattr(TestData, attr)
    s = s.replace(item, str(value))
print(s)

在这里插入图片描述
封装一下:

import re

class TestData:
    id = 123
    name = 'Tony'
    data = '1122'
    title = '测试数据'

s = "{'id': '#id#', 'name': '#name#', 'title': '#title#'}"

def replace_data(data, cls):
    '''
    :param data: 要进行替换的用例数据(字符串)
    :param cls: 测试类
    :return: 返回值
    '''
    while re.search('#(.+?)#', data):
        res2 = re.search('#(.+?)#', data)
        print(res2)
        item = res2.group()
        attr = res2.group(1)
        value = getattr(cls, attr)
        data = s.replace(item, str(value))
    return data

有可能存在数据不在测试类中,也许放到了配置文件里面,以下做了改善:

def replace_data(data, cls):
    '''
    :param data: 要进行替换的用例数据(字符串)
    :param cls: 测试类
    :return: 返回值
    '''
    while re.search('#(.+?)#', data):
        res2 = re.search('#(.+?)#', data)
        print(res2)
        item = res2.group()
        attr = res2.group(1)
        try:
            value = getattr(cls, attr)
        except AttributeError:
            conf.get('test_data', attr)
        data = data.replace(item, str(value))
    return data

综合运用:

针对前面的充值接口test_recharge来使用

from common.tools import replace_data
# 原步骤
item['data'] = item['data'].replace('#number#', str(self.member_id))
# 现步骤
item['data'] = replace_data(item['data'], TestRecharge)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值