【问题标题】:django url regex to match optional parametersdjango url 正则表达式匹配可选参数
【发布时间】:2019-01-15 18:00:15
【问题描述】:

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

  • 用户/24
  • 用户/24/
  • users/24/sam
  • users/24/sam/
  • users/24/sam/tab_name
  • users/24/sam/tab_name/

其中,pk=24,username=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" %}时是可选的

帮我解决这个问题。

【问题讨论】:

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


【解决方案1】:

您可以通过将/ 与可选的non-capturing groups 中的命名捕获组一起放置来使您的/ 成为强制性:

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

请参阅regex demo

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

详情

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

【讨论】:

    猜你喜欢
    • 2012-06-15
    • 2011-07-20
    • 2017-12-01
    • 2011-08-17
    • 2017-09-12
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多