使用Django URL Regex的TypeError

时间:2012-05-31 01:23:29

标签: python regex django

您好我总是与Regex混淆,我不理解对其他帮助主题的回应。

基本上我的问题是,我可以合并

r'^input/?$'

r'^input/index.html?$'

进入这个?

r'^input(/(index.html?)?)?$'

在Django中,我收到此错误:

input() takes exactly 1 argument (3 given)

它只在正确匹配时给出错误,所以也许它不是正则表达式问题?

2 个答案:

答案 0 :(得分:1)

就个人而言,我宁愿不合并两个正则表达式。我认为有两个网址模式,

url(r'^input/?$', input, name="input"),
url(r'^input/index.html?$', input),

比一个人更具可读性。

但是,如果您确实希望将两者合并,则可以使用非捕获括号:

r'^input(?:/(?:index.html?)?)?$'

一个简单的例子可能有助于解释:

>>> import re
>>> # first try the regex with capturing parentheses
>>> capturing=r'^input(/(index.html?)?)?$'
>>> # Django passes the two matching strings to the input view, causing the type error
>>> print re.match(capturing, "input/index.html").groups()
('/index.html', 'index.html')
>>> # repeat with non capturing parentheses
>>> non_capturing=r'^input(?:/(?:index.html?)?)?$'
>>> print re.match(non_capturing, "input/index.html").groups()
()

有关详细信息,请参阅Regular Expression Advanced Syntax Reference页面。

答案 1 :(得分:0)

如果您在urlpatterns中使用此功能,则不需要编写?符号,因为之后的所有内容都可以在您的视图功能中进行解析。使用/input/index.html?param=2正则表达式正确处理对r'^input/index.html$'的请求。然后在视图函数中,您可以获得如下参数:

def my_view(request):
    param = request.GET.get('param', 'default_value')

在此处查找更多信息:https://docs.djangoproject.com/en/1.9/topics/http/urls/