2016-01-13 18 views
2

我有一组瓶路线规则从WERKZEUG /瓶路由规则捕捉类型和/或参数化路径

/<string:name>/<path:id>/ 
/<name>/<path:id>/ 
/<string:name>/<id>/ 

我想用正则表达式来提取ID

/{name}/{id}/ 
/{name}/{id}/ 
/{name}/{id}/ 

对于所有这些(一个正则表达式来统治它们全部),为具有类型的路径工作:路径/<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

+0

你想提取什么?参数'name'和'id'已经被传递给你的视图函数,你不需要自己解析它们。 – davidism

+0

@davidism你可以在这里看到:https://github.com/rochacbruno/flasgger/issues/10这是一个瓶颈扩展与生气API生成API文档,我需要在一组url上执行re.sub。 –

+0

['(<([^<>] * \:)?([^ <>] *)>)'](https://regex101.com/r/gZ2rV3/1)是否按预期工作? –

回答

2

我建议使用

(<([^<>]*:)?([^<>]*)>) 

regex demo is here。不知道你真的需要外部(...)(只有当你使用它re.findall,但你可以删除它们并使用re.finditer和使用match.group(0)访问所有匹配)。

说明:

  • <([^<>]*:)? - 可选组2匹配
    • < - 字面<
    • [^<>]* - 零个或多于<>
    • :其他字符 - 一个文字:
  • ([^<>]*) - 3组匹配零个或超过<和其他字符>
  • >关闭>

你的模式,而贪心.*?的匹配,而需要获取到尽可能多的字符第一个:。因此,它直接去id忽略name。当使用否定字符类别[^<>]时,我们确定我们不会通过>并匹配第一对<...>内的name

+0

不错!它甚至可以使用更多路径。 https://regex101.com/r/gZ2rV3/2 –

+0

我刚刚删除了冗余转义\:(<([^<>] *:)?([^ <>] *)>) –

+0

是的,我把它保存在我最初的演示,但是':'不是特殊字符,所以它可以被转义。 –