2016-01-13 79 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

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