django url 匹配可选参数的正则表达式
django url regex to match optional parameters
我需要一个匹配以下字符串的正则表达式:
- users/24
- users/24/
- users/24/山姆
- users/24/山姆/
- users/24/山姆/tab_name
- users/24/山姆/tab_name/
其中,pk=24,用户名=sam,tab=tab_name
到目前为止我有一个 url 作为:
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" %}
时是可选的
帮我解决这个问题。
您可以将 /
与可选 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]+)
- 组 "username":1+ 个单词或 -
个字符
(?:/(?P<tab>[-\w]+))?
- 可选的非捕获组匹配
/
- 一个 /
字符
(?P<tab>[-\w]+)
- 组 "tab":1+ 个单词或 -
个字符
/?
- 一个可选的 /
字符。
我需要一个匹配以下字符串的正则表达式:
- users/24
- users/24/
- users/24/山姆
- users/24/山姆/
- users/24/山姆/tab_name
- users/24/山姆/tab_name/
其中,pk=24,用户名=sam,tab=tab_name
到目前为止我有一个 url 作为:
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" %}
帮我解决这个问题。
您可以将 /
与可选 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]+)
- 组 "username":1+ 个单词或-
个字符
(?:/(?P<tab>[-\w]+))?
- 可选的非捕获组匹配/
- 一个/
字符(?P<tab>[-\w]+)
- 组 "tab":1+ 个单词或-
个字符
/?
- 一个可选的/
字符。