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



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

  • 用户/24
  • 用户/24/
  • 用户/24/SAM
  • 用户/24/山姆/
  • 用户/24/山姆/tab_name
  • 用户/24/山姆/tab_name/

其中,pk=24,用户名=SAM,制表符=tab_name

到目前为止,我有一个网址为:

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

上面的网址与上面的所有内容相匹配。但是在使用时

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

输出为:用户/samtab_name

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

帮帮我这个。

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

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

请参阅正则表达式演示。

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

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

最新更新