首页 > 解决方案 > django url 正则表达式匹配可选参数

问题描述

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

其中,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" %}

输出是:用户/samtab_name

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

帮我解决这个问题。

标签: regexdjangodjango-templatesdjango-viewsdjango-urls

解决方案


您可以/通过将它们与命名的捕获组放在可选的非捕获组中来强制执行:

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

请参阅正则表达式演示

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

细节

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

推荐阅读