python - 用于从 werkzeug/Flask 路由规则捕获类型和/或参数化路径的规则

标签 python regex flask routes werkzeug

我有一组 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/

相关文章:

python - 如何在多个条件和 groupby 中使用 .loc

java - 我收到 "unreported exception ioexception; must be kept or declared to be thrown"

java - 使用正则表达式处理 URL 字符串中的协议(protocol)

python - 当 parse_dates 失败时,Pandas 会删除行

python - Django migrate : django. db.utils.OperationalError : (1364, "Field ' 名称'没有默认值")

python - 使用不同长度的 Pandas 数据帧计算滚动窗口的加权和

javascript - 使用正则表达式将子组放入数组中

python - 使用 Flasks app.logger 有什么好处?

python - 将 Flask 应用程序部署到 Heroku

python-rq Queue.job_ids 始终为空