我有一个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语法。
有什么想法?无论做什么工作都很优雅,我都很高兴。
感谢您的时间,
添
答案 0 :(得分:1)
你想要的是:
url(r'^base_url/(?P<serial>[^/]{13}/$', view_method),
添加了end
和start
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