Django URL正则表达式以匹配可选参数

时间:2018-08-08 12:49:59

标签: regex django django-templates django-views django-urls

我需要一个与以下字符串匹配的正则表达式:

  • users / 24
  • users / 24 /
  • users / 24 / sam
  • users / 24 / sam /
  • users / 24 / sam / tab_name
  • users / 24 / sam / tab_name /

其中, pk = 24,用户名= sam,tab = tab_name

到目前为止,我的网址为:

url(r'^users/(?P<pk>\d+)/(?P<username>[-\w\d]+)?/?(?P<tab>[-\w\d]+)?/?', vw.ProfileView.as_view(), name='profile')

上面的url匹配上面的所有内容。但是在使用

{% url 'profile' pk=24 username="sam" tab="tab_name" %}

输出为: users / samtab_name

我在这里知道问题所在,即/?可选斜杠。但是我不希望在使用{% url 'profile' pk=24 username="sam" tab="tab_name" %}

时它是可选的

帮我解决这个问题。

1 个答案:

答案 0 :(得分:2)

您可以通过将/和命名的捕获组放到可选的non-capturing groups中来使它们成为必需:

^users/(?P<pk>\d+)(?:/(?P<username>[-\w]+))?(?:/(?P<tab>[-\w]+))?/?

请参见regex demo

请注意,\w已经与数字匹配,因此在字符类中不需要\d

详细信息

  • ^-字符串的开头
  • users/-文字子字符串
  • (?P<pk>\d+)-匹配1+ digtis的命名捕获组“ pk”
  • (?:/(?P<username>[-\w]+))?-可选的非捕获组(在结束?之后有)个量词)匹配
    • /-一个/字符
    • (?P<username>[-\w]+)-组“用户名”:1个以上的单词或-个字符
  • (?:/(?P<tab>[-\w]+))?-可选的非捕获组匹配
    • /-一个/字符
    • (?P<tab>[-\w]+)-组“标签”:1个以上的单词或-个字符
  • /?-可选的/字符。