正则表达式命名的组以开头但不以结尾

2024-09-30 01:30:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

但它不起作用,我总是用字符串进入后者,不管字符串是以“我的字符串”结尾还是以“我的字符串”结尾

我也尝试了另一种方法,因为我的正则表达式是自上而下计算的,但它也不起作用:

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

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

Tags: 方法字符串答案stringfoomy结尾foobar
2条回答

更正。。。对于这个特殊的需求,您需要在$之前有一个look-BEHIND断言,以确保字符串不会以my string/结尾:

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

我真的不知道你想用这个。。。看起来你想捕获它,可选吗?你可以把(?)?:P)?就在foo之前:

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

您应该对第二个regex使用这个负lookahead,因为[-\w]+是贪婪的,所以您甚至在触发负lookahead检查之前就消耗了整个字符串。你知道吗

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

相关问题 更多 >

    热门问题