使用“OR”条件的正则表达式

时间:2008-10-09 13:48:54

标签: regex django django-urls

我可以使用一些帮助来编写正则表达式。在我的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}))$

6 个答案:

答案 0 :(得分:5)

略过|,使用?()

http://www\.example\.com/A1(/B2(/C3)?)?

如果用模式替换A1-C3:

http://www\.example\.com/[^/]*(/[^/]*(/[^/]*)?)?

说明:

  • 它匹配以http://www.example.com/A1
  • 开头的每个字符串
  • 它可以匹配额外的/B2甚至是额外的/C3,但/C3仅匹配,只有/B2
  • [^/]*(尽可能多的非斜线)
  • 如果您需要特殊捕获组中的A1-C3,可以使用:

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)

您可以在线查看here或获取此tool(是的,它是免费的,甚至用Lisp写的......)。

答案 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调度程序规则。