Django:匹配urlconf中一组密钥正则表达式中的一个或多个

时间:2013-05-09 21:45:26

标签: python regex django grouping urlconf

我有一个Django视图,它接受三个可选的keyworded参数。我想处理正则表达式,以便在一行中将可能的URL匹配到此视图。我想很好地构建网址。

一个例子: 我可能的参数是start,它是一个int,serial是一个长度为13的字符串,end是另一个int。

网址可能如下:

/main/s20130509/e20130510/ABC1234567890
or
/main/s20130509/e20130510/
or 
/main/ABC1234567890

e和s前缀组件分别结束和启动,ABC1234567890是串行的。

我想拉出这些结尾,开始,串行值并将它们作为值start = s20130509等传递给视图......

现在我通过在单独的行上详尽地列出排列来做到这一点,似乎必须有更好的方法。

我正在尝试做类似的事情:

url(r'^base_url/(?P<serial>[^/]{13}|(?P<end>e\d{8})|(?P<start>s\d{8})/*$', view_method),

基本上,我想要做的逻辑对我来说很清楚;我想拉出三个匹配中的任何一个的所有实例,并将它们作为关键参数传递给它们,但我找不到一个资源来找出适合它的ReGex语法。

有什么想法?无论做什么工作都很优雅,我都很高兴。

感谢您的时间,

1 个答案:

答案 0 :(得分:1)

你想要的是:

url(r'^base_url/(?P<serial>[^/]{13}/$', view_method),

添加了endstart kwargs的可选组,因此:

# Optional, non-capturing group surrounding the named group for each (so you don't have to capture the slashes or the "e" or "s"
(?:e(?P<end>\d{8})/)

然后,按任意顺序允许最多2个:

((?:s(?P<start>\d{8})/)|(?:e(?P<end>\d{8})/)){0,2}

结果是:

url(r'^base_url/((?:s(?P<start>\d{8})/)|(?:e(?P<end>\d{8})/)){0,2}(?P<serial>[^/]{13})/$', view_method),

免责声明,我在此框中写了这个,所以我需要花一点时间来测试它并更新答案(如果这是错的)。

更新

确实,它有效:)我匹配以下内容:

http://127.0.0.1:8080/base_url/e77777777/s88888888/1234567890123/
http://127.0.0.1:8080/base_url/s88888888/e77777777/1234567890123/
http://127.0.0.1:8080/base_url/s88888888/1234567890123/
http://127.0.0.1:8080/base_url/e77777777/1234567890123/
http://127.0.0.1:8080/base_url/1234567890123/

kwargs看起来像这样(在get子类的View方法的例外情况下,当提出所有三个段时请求 - 结束和/或开始是{{1}当被遗漏时):

None