如何在Django 2中使用此正则表达式URL模式

时间:2018-06-29 20:31:17

标签: regex django python-3.x url-pattern django-2.0

我需要制作一个适用于该URL的URL模式:

mysite.com/blog/12/بلاگ-مثال

它包含utf-8字符,因此我尝试使用\X

re_path(r'^blog/?P<blog_id>[\d+]+/(?P<slug>[\X.*]+)/$', views.single_blog, name='single_blog')

但是没有用。我不知道为什么可能只是因为我在正则表达式方面不擅长。因此,我仅使用.*尝试了另一种模式来接受任何内容:

re_path(r'^blog/?P<blog_id>[\d+]+/(?P<slug>[.*]+)/$', views.single_blog, name='single_blog')

但这也行不通,我得到:

  

当前路径blog / 12 /بلاگ-مثال与任何这些都不匹配。

因此,正如我提到的那样,我对正则表达式并不满意,什么是解决此问题的正确方法?

是时候说now I have two problems还是正则表达式是唯一的方法?

2 个答案:

答案 0 :(得分:2)

您的匹配方法无效,因为Python \X不支持re,而[.*]+匹配1个以上的点或星号,但不匹配任何字符(因为您放置了{{ 1}}放入.*字符类中,它们表示文字符号,而不是特殊字符。

此外,[...]还是与任何数字或[\d+]+匹配1次或多次的字符类,因此也有问题。

您可以使用+否定字符类来匹配除[^/]以外的任何字符:

/

详细信息

  • r'^blog/(?P<blog_id>\d+)/(?P<slug>[^/]+)/?$' -输入开始
  • ^-文字替代
  • blog/-组“ blog_id”:1个以上数字
  • (?P<blog_id>\d+)-一个/
  • /-组“子弹”:除(?P<slug>[^/]+)以外的其他1个字符
  • /-可选的/?
  • /-字符串的结尾。

Here is a regex demo(请注意,阿拉伯语脚本中突出显示的字符在那里不起作用。)

答案 1 :(得分:2)

  

现在是时候说我有两个问题了...

实际上,您已经选择了适合此任务的工作。

另一个答案似乎有效,但不能容忍波斯语一词。我发布此答案是为了说明为什么您自己的正则表达式无法按预期运行。

  1. ?P<blog_id>[\d+]+

在这里您可能指的是一个命名组,与稍后在正则表达式中使用的命名组相同。您错过了左括号和右括号:(?P<blog_id>[\d+]+)。另外,[\d+]表示由数字和+组成的字符类。您需要删除+(?P<blog_id>[0-9]+)

  1. (?P<slug>[\X.*]+)

构造应该是可以的,但字符类不是。 \X在字符类中没有特殊含义,更不用说re模块也不支持它的Python了。 .*也不例外。在字符类中,几乎所有特殊标记都按字面意义处理。

因此[\X.*]匹配X.或星号*。您需要将其更改为更通用的名称,例如[^/]+,这意味着匹配第一个斜杠(=匹配除正斜杠之外的所有内容)。