python 正则表达式格式化请求url

背景

为了有效统计接口的覆盖率,并为后续实现接口层级的精准测试奠定基础,我们需要将自动化发起的请求 URL 保存至数据库。然而,在对收集到的请求 URL 进行分析时,我们发现许多接口的 URL 是通过参数拼接的。例如,查询日志的接口通常会包含一个特定的日志 ID。如果不对这些参数进行处理,可能会导致数据库中存储大量重复的、相似的 URL,从而影响后续的数据分析和测试效率。

解决方案

函数的主要功能是将给定的 URL 中的特定参数替换为 {key} 格式,同时将 UUID 和数字替换为 {uuid} 和 {num}。这样可以方便地在 API 路径中使用占位符,并且去重。

# -*- coding: utf-8 -*-
# @Time    : 2025/3/6 16:03
# @Author  : X1A0RAN
# @Software: PyCharm
# @Desc    :
import re

# 正则表达式匹配 UUID
uuid_pattern = r'([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}|[0-9a-fA-F]{32})'


def url_format(url, params={}):
    uuid_pattern = r'([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}|[0-9a-fA-F]{32})'

    api_urls = url.split('?')[0].split('/')
    for k, v in params.items():
        value = str(v)
        if value in api_urls:
            api_urls = ['{' + k + '}' if x == value else x for x in api_urls]

    api_urls = ['{uuid}' if bool(re.search(uuid_pattern, x)) else x for x in api_urls]
    api_urls = ['{num}' if x.isdigit() else x for x in api_urls]

    return '/'.join(api_urls)


if __name__ == '__main__':
    print(url_format('/avs/services/b63fa8b8-a794-421e-8b83-a23b9d1d19c2'))
    # /avs/services/{uuid}
    
    print(url_format('/openapi/iam/v1/users/97df52b3cdc34e0a8d99faa6dfb84eb1/association/prm/545912'))
    # /openapi/iam/v1/users/{uuid}/association/prm/{num}

    print(url_format(
        '/tenant/ulogs/77b69ef6-0b7b-4702-9acf-f3a52f734ca9',
        {'ulog_id': '77b69ef6-0b7b-4702-9acf-f3a52f734ca9'}
    ))
    # /tenant/ulogs/{ulog_id}

    print(url_format(
        '/project/info/7cedf11ce31b64e2bbc547172562a3755',
        {'project_id': '7cedf11ce31b64e2bbc547172562a3755'}
    ))
    # /project/info/{project_id}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

X1A0RAN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值