你能帮我解决Django的URL正则表达式吗?

时间:2012-05-03 20:13:55

标签: python regex django

目前,我的一个网址无法正常工作,因为我无法与之匹配。我在urls.py中有以下条目

url(r'no_inventariado/nuevo/(?P<nombre>\S+)/(?P<serie>[a-zA-Z0-9_]*)/(?P<extension>\d{4})', 'inventario.views.nuevo_resguardo', name='nuevo_resguardo'),$ 

问题似乎出现在<nombre>中。我正在使用的网址包含<nombre>点中的大写,小写和空格。

实施例

http://127.0.0.1:8000/inventario/no_inventariado/nuevo/LUIS%20%20RICARDO%20DAVID%20P/XXXBX7399F11/7070/

我该如何解决这个问题?任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:2)

如果您现在允许\S+,则表示任何非空白字符,您现在想要添加空格,然后使用.+?

url(r'no_inventariado/nuevo/(?P<nombre>.+?)/(?P<serie>[a-zA-Z0-9_]*)/(?P<extension>\d{4})>     'inventario.views.nuevo_resguardo', name='nuevo_resguardo'),$

+?有一个非贪婪的匹配,意味着.+?将匹配每个字符,直到下一个斜线。

答案 1 :(得分:2)

\S应匹配所有非空白字符,但示例中的%20是编码空格。我不能肯定地说,但我猜测在GET请求到达url处理程序之前,空格正在被解码。您可以通过使用不带空格的名称进行测试来确认这一点。

如果这是问题,你可以通过使用像(?P<nombre>[^/]+)这样的捕获组来解决它(“所有不是正斜杠的东西”)。

答案 2 :(得分:1)

我做了一个简单的测试,它可以在我的机器上运行:

from django.conf.urls import patterns, include, url
from django.http import HttpResponse

def hello(request, nombre):
    return HttpResponse('Hello: '+nombre)

urlpatterns = patterns('',
    url(r'^(?P<nombre>[a-zA-Z\s]*)/$', hello),
)

但它不适用于\ S