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-string”结尾或不以“my-string”结尾的字符串进入后者

我也尝试了相反的方法,因为我的正则表达式是从上到下评估的,但它也不起作用:

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

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

2 回答 2

2

您应该对第二个正则表达式使用此负前瞻,因为[-\w]+它是贪婪的,因此即使在触发负前瞻检查之前,您最终也会消耗整个字符串。

p = r'(?P<slug>(?!.*my-string/$)(^foo)[-\w]+)'
于 2013-10-25T14:50:50.690 回答
2

更正...对于这个特殊要求,您需要在 $ 之前查看 BEHIND 断言,以确保字符串不以 my-string/ 结尾:

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

我不太确定你想用 P 做什么......看起来你想捕获它,可选?你可以把(?:P)?就在 foo 之前:

((?:P<slug>)?foo[-\w\/]+)(?<!my-string\/)$
于 2013-10-25T14:09:44.880 回答