我正在按照与Django一起使用的教程,有一个像这样的URL模式:
url(r'^lists/(.+)/$', views.list_view, name='list_view')
这是一个贪婪的正则表达式模式,它将匹配以下内容: lists / 123 / add_item / , 123 / add_item 作为匹配组。这不是预期的。所以我试着把它改成像这样的非贪婪的人:
url(r'^lists/(.+?)/$', views.list_view, name='list_view')
但Django仍然将其解析为views.list_view
你可以给我一些解释吗?答案 0 :(得分:1)
您应该从正则表达式中删除尾随$
,因为它始终与最终/
而不是下一个re.search
匹配。
我认为Django与第二个URL匹配的事实是由于Django与URL不匹配,而是使用ReactWebComponent.create(<App />, 'my-react-web-component', { css: 'inject' });
。您可以在此处看到此行为:Django source
答案 1 :(得分:0)
^lists/(.+?)/$
的解释:
^
在字符串lists
字面匹配字符列表(区分大小写)/
字面匹配字符/
(区分大小写)(.+?)
.+?
匹配任何字符(行终止符除外) +?
量词 - 匹配一个和无限次,尽可能少,根据需要进行扩展(懒惰)/
字面匹配字符/
(区分大小写)$
表示字符串结尾但我并不理解你想要什么完全匹配你的模式
更新:
有用的链接:https://docs.python.org/3/howto/regex.html#greedy-versus-non-greedy
答案 2 :(得分:0)
您应该将模式限制为仅捕获您想要的内容。在你的情况下,它似乎是数字,所以:
url(r'^lists/(\d+)/$', views.list_view, name='list_view')