我可以使用一些帮助来编写正则表达式。在我的Django应用程序中,用户可以点击以下URL:
http://www.example.com/A1/B2/C3
我想创建一个允许接受以下任何一个有效URL的正则表达式:
http://www.example.com/A1
http://www.example.com/A1/B2
http://www.example.com/A1/B2/C3
我猜我需要使用“OR”条件,但我无法让我的正则表达式进行验证。有什么想法吗?
更新:到目前为止这是正则表达式。请注意,我没有包含“http://www.example.com”部分 - Django为我处理。我只关心验证1,2或3个子目录。
^(\w{1,20})|((\w{1,20})/(\w{1,20}))|((\w{1,20})/(\w{1,20})/(\w{1,20}))$
答案 0 :(得分:5)
略过|
,使用?
和()
http://www\.example\.com/A1(/B2(/C3)?)?
如果用模式替换A1-C3:
http://www\.example\.com/[^/]*(/[^/]*(/[^/]*)?)?
说明:
http://www.example.com/A1
/B2
甚至是额外的/C3
,但/C3
仅匹配,只有/B2
[^/]*
(尽可能多的非斜线) http://www\.example\.com/([^/]*)(/([^/]*)(/([^/]*))?)?
将给予(groupnumber: content
):
matches: 0: (http://www.example.com/dir1/dir2/dir3)
1: (dir1)
2: (/dir2/dir3)
3: (dir2)
4: (/dir3)
5: (dir3)
答案 1 :(得分:3)
有更多Django方法可以做到这一点:
urlpatterns = patterns('',
url(r'^(?P<object_slug1>\w{2}/(?P<object_slug2>\w{2}/(?P<object_slug3>\w{2})$', direct_to_template, {"template": "two_levels_deep.html"}, name="two_deep"),
url(r'^(?P<object_slug1>\w{2}/(?P<object_slug2>\w{2})$', direct_to_template, {"template": "one_level_deep.html"}, name="one_deep"),
url(r'^(?P<object_slug1>\w{2})$', direct_to_template, {"template": "homepage.html"}, name="home"),
)
其他方法没有利用Django传递变量的能力。
编辑:我将urlpattern的顺序切换为解析器更明显(即自下而上比自上而下更明确)。
答案 2 :(得分:1)
http://www\.example\.com/A1(/B2(/C3)?)?
答案 3 :(得分:1)
^(\w{1,20})(/\w{1,20})*
如果您只想要2:
,这可以用于任意多个子目录 ^(\w{1,20})(/\w{1,20}){0,2}
答案 4 :(得分:1)
如果我理解,我认为你需要围绕整个OR声明另外一套:
^((\w{1,20})|((\w{1,20})/(\w{1,20}))|((\w{1,20})/(\w{1,20})/(\w{1,20})))$
答案 5 :(得分:1)
请注意,Django的reverse URL matching(永久链接,reverse()
和{% url %}
)可以处理有限的正则表达式子集。为了能够使用它们,有时需要将复杂的正则表达式分成单独的URL调度程序规则。