我有两个正则表达式(简化为相同)
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$))/$'
答案 0 :(得分:2)
更正...对于这个特殊要求,你需要在$之前看一下BEHIND断言,以确保字符串不以my-string /结尾:
(foo[-\w\/]+)(?<!my-string\/)$
我不确定你在尝试用P做什么...看起来你想要捕捉它,可选?你可以把(?:P)?就在foo之前:
((?:P<slug>)?foo[-\w\/]+)(?<!my-string\/)$
答案 1 :(得分:2)
你应该对第二个正则表达式使用这个负向前瞻,因为[-\w]+
是贪婪的,所以你甚至在触发检查否定前瞻之前就会消耗掉整个字符串。
p = r'(?P<slug>(?!.*my-string/$)(^foo)[-\w]+)'