我有一组 Flask 路线
/<string:name>/<path:id>/
/<name>/<path:id>/
/<string:name>/<id>/
我想使用正则表达式来提取名称和id
/{name}/{id}/
/{name}/{id}/
/{name}/{id}/
对于所有这些(一个正则表达式来统治它们),适用于具有 type:path 的路径,如 /<string:name>/
以及那些没有像 /<name>/
这样的类型
但我正在尝试:
(<(.*?\:)?(.*?)>)
只能匹配
/{name}/{id}/
/{id}/ # <--- Why this is not matching /{name}/{id}/
/{name}/{id}/
有正则表达式专家可以帮忙吗?
在线正则表达式:https://regex101.com/r/iL3jK2/3
问题:https://github.com/rochacbruno/flasgger/issues/10
最佳答案
我建议使用
(<([^<>]*:)?([^<>]*)>)
regex demo is here 。不确定您是否真的需要外部 (...)
(仅当您将其与 re.findall
一起使用时,但您可以删除它们并使用 re.finditer
并使用 match.group(0)
访问所有匹配项)。
说明:
-
<([^<>]*:)?
- 可选的第 2 组匹配-
<
- 字面量<
-
[^<>]*
- 除<
之外的零个或多个字符和>
-
:
- 字面量:
-
-
([^<>]*)
- 第 3 组匹配除<
之外的零个或多个字符和>
-
>
关闭>
你的模式相当贪婪,如 .*?
匹配尽可能多的字符以到达第一个 :
。因此,它直接进入 id
忽略name
。使用否定字符类时[^<>]
,我们确信我们不会经历 >
并匹配 name
在第一对 <...>
内.
关于python - 用于从 werkzeug/Flask 路由规则捕获类型和/或参数化路径的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34777613/