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<pk>\d+)(?:/(?P<username>[-\w]+))?(?:/(?P<tab>[-\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<pk>\d+)
- 一个命名的捕获组“pk”匹配 1+ digtis
(?:/(?P<username>[-\w]+))?
- 一个可选的非捕获组(关闭 )
后有 ?
量词)匹配
/
- 一个 /
字符
(?P<username>[-\w]+)
- 组“用户名”:1+ 字或-
字符
(?:/(?P<tab>[-\w]+))?
- 可选的非捕获组匹配
/
- 一个 /
字符
(?P<tab>[-\w]+)
- 组“标签”:1+ 字或-
字符
/?
- 一个可选的 /
字符。
【讨论】:
以上是关于django url 正则表达式匹配可选参数的主要内容,如果未能解决你的问题,请参考以下文章