django url 匹配可选参数的正则表达式

django url regex to match optional parameters

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

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

到目前为止我有一个 url 作为:

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" %}

时是可选的

帮我解决这个问题。

您可以将 / 与可选 non-capturing groups:

中的命名捕获组放在一起,从而使它们成为强制性的
^users/(?P<pk>\d+)(?:/(?P<username>[-\w]+))?(?:/(?P<tab>[-\w]+))?/?

参见regex demo

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

详情

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