Django如何解决这个非贪婪的正则表达式url模式?

时间:2017-08-10 07:16:21

标签: django django-urls

我正在按照与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

你可以给我一些解释吗?

3 个答案:

答案 0 :(得分:1)

您应该从正则表达式中删除尾随$,因为它始终与最终/而不是下一个re.search匹配。

我认为Django与第二个URL匹配的事实是由于Django与URL不匹配,而是使用ReactWebComponent.create(<App />, 'my-react-web-component', { css: 'inject' }); 。您可以在此处看到此行为:Django source

答案 1 :(得分:0)

^lists/(.+?)/$的解释:

  • ^在字符串
  • 的开头断言位置
  • lists字面匹配字符列表(区分大小写)
  • /字面匹配字符/(区分大小写)
  • 第一捕获小组(.+?)
    • .+?匹配任何字符(行终止符除外)
    • +?量词 - 匹配一个无限次,尽可能少,根据需要进行扩展(懒惰)
  • /字面匹配字符/(区分大小写)
  • $表示字符串结尾

致谢:http://regex101.com

但我并不理解你想要什么完全匹配你的模式

更新

有用的链接https://docs.python.org/3/howto/regex.html#greedy-versus-non-greedy

答案 2 :(得分:0)

您应该将模式限制为仅捕获您想要的内容。在你的情况下,它似乎是数字,所以:

url(r'^lists/(\d+)/$', views.list_view, name='list_view')