我需要一个与以下字符串匹配的正则表达式:
其中, pk = 24,用户名= 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" %}
帮我解决这个问题。
答案 0 :(得分:2)
您可以通过将/
和命名的捕获组放到可选的non-capturing groups中来使它们成为必需:
^users/(?P<pk>\d+)(?:/(?P<username>[-\w]+))?(?:/(?P<tab>[-\w]+))?/?
请参见regex demo。
请注意,\w
已经与数字匹配,因此在字符类中不需要\d
。
详细信息
^
-字符串的开头users/
-文字子字符串(?P<pk>\d+)
-匹配1+ digtis的命名捕获组“ pk” (?:/(?P<username>[-\w]+))?
-可选的非捕获组(在结束?
之后有)
个量词)匹配
/
-一个/
字符(?P<username>[-\w]+)
-组“用户名”:1个以上的单词或-
个字符(?:/(?P<tab>[-\w]+))?
-可选的非捕获组匹配
/
-一个/
字符(?P<tab>[-\w]+)
-组“标签”:1个以上的单词或-
个字符/?
-可选的/
字符。