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

Posted

技术标签:

【中文标题】django url 正则表达式匹配可选参数【英文标题】:django url regex to match optional parameters 【发布时间】: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" %时是可选的

帮我解决这个问题。

【问题讨论】:

试试^users/(?P&lt;pk&gt;\d+)(?:/(?P&lt;username&gt;[-\w]+))?(?:/(?P&lt;tab&gt;[-\w]+))?/?。不过不确定您是否需要最后一个/? 我建议您使用所需的斜线(使用/ 而不是/?)。然后默认的 Django 行为将重定向到带有斜杠的 URL(例如 /users/24/sam -> /users/24/sam/)。有关更多信息,请参阅 append_slash 上的文档。 @WiktorStribiżew 您的正则表达式完成了这项工作。如果您解释一下?:,我将不胜感激 【参考方案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+ 字或- 字符 /? - 一个可选的 / 字符。

【讨论】:

以上是关于django url 正则表达式匹配可选参数的主要内容,如果未能解决你的问题,请参考以下文章

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

Django路由系统(一)

django基础

Django url()函数详解

Django的路由设置

Django-url路由映射与views逻辑处理