首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >识别restAPI的resourcePath的Regex模式

识别restAPI的resourcePath的Regex模式
EN

Stack Overflow用户
提问于 2020-07-08 10:39:39
回答 2查看 99关注 0票数 0

我需要一些python来根据'URL‘字符串来确定’短名称‘。

我尝试过下面的RegEx模式,但是它不适用于下面的情况。

案例-1 :

输入'Get帐户‘的URL可以是

代码语言:javascript
复制
"GET /env/org/v1/insurance/accounts"
"GET /env/org/v1/insurance/accounts?page&page-size"

注意:在这里,查询参数可能存在,也可能不存在。

Regex-1:

代码语言:javascript
复制
^GET /env/org/v1/insurance/accounts(\?)?(\w)?$

案例-2:

输入'Get事务‘的URL可以是

代码语言:javascript
复制
"GET /env/org/v1/insurance/accounts/B001E2E0-7E5/transactions"
"GET /env/org/v1/insurance/accounts/6286CDC4-E2B/transactions?oldest-time"

注意:在这里,'TransactionID‘每次都会发生变化,查询参数可能存在也可能不存在。

Regex-2:

代码语言:javascript
复制
^GET /env/org/v1/insurance/accounts/[A-Za-Z0-9\-]+/transactions(\?)?(\w)?$

案例-3 :

“获取单个事务”的输入字符串可以是

代码语言:javascript
复制
"GET /env/org/v1/insurance/accounts/091CCD40-2E7/transactions/091CCD40-1E7?page"

这样我就可以在Python代码中使用如下所示:

代码语言:javascript
复制
import re

def get_short_name(str):
    if(re.match(regex_1,str):
        return 'Get Accounts'
    elif(re.match(regex_2,str):
        return 'Get Transactions'
    elif(re.match(regex_3,str):
        return 'Get Single Transactions'
    else:
        return str
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-08 11:29:57

如果您想将正则表达式分为三个部分;您可以尝试这样的方法:

代码语言:javascript
复制
1. ^GET \/sit1\/org\/v1\/insurance\/accounts(?:\?.*)?$
2. ^GET \/sit1\/org\/v1\/insurance\/accounts\/.*$
3. ^GET \/sit1\/org\/v1\/insurance\/accounts\/.*\/transactions\/.*$

对上述正则表达式的解释:

  • ^, $ --表示行respectively.
  • GET \/sit1\/org\/v1\/insurance\/accounts的开始和结束--与转义/.
  • (?:\?.*)?匹配--表示匹配\?之后的所有内容的。外部optional.
  • \/.*表示与整个模式0或1次匹配的量化符,即在第二个正则表达式中使其为accounts/.
  • \/.*\/transactions\/.*;在第三个正则表达式中表示匹配accounts/.
  • \/.*\/transactions\/.*之后的所有内容;在第三个正则表达式中表示所有内容;在/transactions/之前捕获所有内容,然后再捕获到行尾的所有内容。

python中的示例实现:

代码语言:javascript
复制
import re

regex_1 = r"^GET \/sit1\/org\/v1\/insurance\/accounts(?:\?.*)?$"
regex_2 = r"^GET \/sit1\/org\/v1\/insurance\/accounts\/.*$"
regex_3= r"^GET \/sit1\/org\/v1\/insurance\/accounts\/.*\/transactions\/.*$"

test_str_accounts = "GET /sit1/org/v1/insurance/accounts?page&page-size"
test_str_transactions = "GET /sit1/org/v1/insurance/accounts/6286CDC4-E2B/transactions?oldest-time"
test_str_single_transactions = "GET /sit1/org/v1/insurance/accounts/091CCD40-2E7/transactions/091CCD40-1E7?page"



def get_short_name(str):
    if re.match(regex_1,str):
        return 'Get Accounts'
    elif re.match(regex_3,str):
        return 'Get Single Transactions'
    elif re.match(regex_2,str):
        return 'Get Transactions'
    else:
        return str
    
print(get_short_name(test_str_accounts))
print(get_short_name(test_str_transactions))
print(get_short_name(test_str_single_transactions))

您可以在中找到上述实现的示例运行。

注意:请注意if语句的顺序。首先检查事务3。

票数 1
EN

Stack Overflow用户

发布于 2020-07-08 10:48:23

您可以使用urlparsestr.endswith

Ex:

代码语言:javascript
复制
from urllib.parse import urlparse

data = ['GET /sit1/org/v1/insurance/accounts', 'GET /sit1/org/v1/insurance/accounts?page&page-size', 'GET /sit1/org/v1/insurance/accounts/B001E2E0-7E5/transactions', 'GET /sit1/org/v1/insurance/accounts/6286CDC4-E2B/transactions?oldest-time']

for url in data:
    o = urlparse(url.split()[1])
    print(o.path)
    if o.path.endswith('accounts'):
        print('accounts')
    if o.path.endswith('transactions'):
        print('transactions')

输出:

代码语言:javascript
复制
/sit1/org/v1/insurance/accounts
/sit1/org/v1/insurance/accounts
/sit1/org/v1/insurance/accounts/B001E2E0-7E5/transactions
/sit1/org/v1/insurance/accounts/6286CDC4-E2B/transactions
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62792939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档