正则表达式命名组开始但不结束

时间:2013-10-25 13:58:43

标签: python c regex

我有两个正则表达式(简化为相同)

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$))/$'

2 个答案:

答案 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]+)'