2013-10-25 26 views
1

未結束我有兩個正則表達式(簡化爲相等)正則表達式命名組開始但

r'^(?P<slug>(^foo)[-\w]+)/$' 

r'^(?P<slug>(^foo)[-\w]+)/$' 

我向在第一添加排除到檢查結束,以便後者獲勝。

例如:

foobar/應通過第一,從來沒有後者

我想foobar-my-string/失敗的第一,但匹配後者

我已經試過@ sdanzig的回答是:

r'^(?P<slug>(^foo)[-\w]+(?!my-string$))/$' 

r'^(?P<slug>(^foo)[-\w]+)/$' 

但它不起作用我總是進入後者的字符串做或不以「my-s結束特林」

我也試了一下週圍的其他方法爲我的正則表達式求值上下,但它也不起作用:

r'^(?P<slug>(^foo)[-\w]+(my-string$))/$' 

r'^(?P<slug>(^foo)[-\w]+(?!my-string$))/$' 
+0

我不明白。你說'foobar /'應該先通過,但'foobar-my-string /'不應該先通過。能夠清楚地解釋確切的要求嗎? –

+0

我不希望以「my-string」結尾的字符串通過第一個,我犯了一個錯誤更新q – user2298943

+0

你想要1個正則表達式還是2個?現在你已經刪除了'barfoo /'部分。這不是必需的嗎? –

回答

2

因爲[-\w]+是貪婪的,所以你最終消費的整個字符串你觸發負先行檢查,甚至之前,您應該使用負前瞻第二個正則表達式。

p = r'(?P<slug>(?!.*my-string/$)(^foo)[-\w]+)' 
+0

真棒謝謝! – user2298943

2

修正......這個特殊的要求,你需要一個向後看斷言,就在$之前,以確保字符串不以我的字符串結束/:

(foo[-\w\/]+)(?<!my-string\/)$ 

我真的不知道你想與P做什麼?它看起來像你想捕捉它,可選?你可以把(?:P)?只是FOO前:

((?:P<slug>)?foo[-\w\/]+)(?<!my-string\/)$ 
+0

請參閱「我嘗試過」更新,它不起作用 – user2298943