0

为什么这不起作用:

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

我想要实现的是第一个数字是必需的,第三个和第四个是可选的。因此,用户可以将 2、3 或 4 个参数传递给定义如下的视图:

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

我当前的代码在传递 3 或 4 个参数时工作,而不是 2 个。

怎么了?

4

1 回答 1

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)
于 2013-03-06T22:36:28.653 回答