2013-03-06 69 views
0

爲什麼這是行不通的:傳遞4位,查看

(r'^something/(?P<id1>\d+)/(?P<id2>\d+)/(?:(?P<id3>\d+)/)(?:(?P<id4>\d+)/)?$', 'something'), 

我想實現是有需要的第一個數字,第三和第四可選。經過3個或4 ARGS,不2.

什麼是錯誤的,當

def compare(request, id1, id2, id3=None, id4=None): 

我當前的代碼工作:所以用戶可以通過2,3或4 PARAMS到定義如下的看法?

+1

您忘記了那裏有一個問號...... – 2013-03-06 22:36:56

回答

4

第三個數字組在您的正則表達式中是強制性的。

^something/(?P<id1>\d+)/(?P<id2>\d+)/(?:(?P<id3>\d+)/)?(?:(?P<id4>\d+)/)?$ 

而且,書面,斜線後的第三和第四組是強制性的:

In [4]: p = re.compile(r'^something/(?P<id1>\d+)/(?P<id2>\d+)/(?:(?P<id3>\d+)/)?(?:(?P<id4>\d+)/)?$') 

In [5]: p.match('something/1/2/3/4/').groups() 
Out[5]: ('1', '2', '3', '4') 

In [6]: p.match('something/1/2/3/4').groups() 
Out[6]: ('1', '2', '3', None) 

In [7]: p.match('something/1/2/3/').groups() 
Out[7]: ('1', '2', '3', None) 

In [8]: p.match('something/1/2/3').groups() 
Out[8]: ('1', '2', None, None) 

In [9]: p.match('something/1/2/').groups() 
Out[9]: ('1', '2', None, None) 

您可能要到第三移動到第四組,使第四個可選:

In [12]: p = re.compile(r'^something/(?P<id1>\d+)/(?P<id2>\d+)/(?:(?P<id3>\d+))?(?:/(?P<id4>\d+)/?)?$') 

In [13]: import re 
KeyboardInterrupt 

In [13]: p.match('something/1/2/3/4').groups() 
Out[13]: ('1', '2', '3', '4') 

In [14]: p.match('something/1/2/3/').groups() 
Out[14]: ('1', '2', '3', None) 

In [15]: p.match('something/1/2/3').groups() 
Out[15]: ('1', '2', '3', None) 

In [16]: p.match('something/1/2/').groups() 
Out[16]: ('1', '2', None, None) 
+0

您的代碼有效,但允許超過4個參數。我需要它限制到4最大。 – 2013-03-06 22:51:32

+0

對不起,我只是miscopied'$'。固定。 – 2013-03-06 22:53:53