使用Regex进行多个url调度

时间:2014-03-11 20:11:59

标签: python regex django django-urls

我有两个URL调度。一个在http://domain.com/thisword上捕获单词,而第二个发送是http://domain.com/sitemap.xml上的站点地图。当前无效的代码是:

urlpatterns = patterns('',
    url(ur'(?P<search_word>[ÆØÅæøåa-zA-Z]*)/?$', 'website.views.index_view', name='website_index'),
    url(r'^sitemap\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}),
)

所以基本上第一次派遣会抓住所有内容,包括sitemap.xml。是否有可能以下列方式进行多次调度?

2 个答案:

答案 0 :(得分:3)

好问题。 (感谢您在这里发布完整的代码。现在,我想看看您的目标是什么。)最简单的解决方案是扭转这样的模式:

urlpatterns = patterns('',
    url(r'^sitemap\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}),
    url(ur'(?P<search_word>[ÆØÅæøåa-zA-Z]*)/?$', 'website.views.index_view', name='website_index'),
)

调度程序在发现匹配时调度。因此,如果网址与上面r'^sitemap\.xml$中的urlpatterns匹配,则调度程序将不会继续使用第二种模式

答案 1 :(得分:0)

除了Justin的回答之外,我想补充一点,在一般情况下,您可以使用负前瞻模式来阻止某些字符串匹配。 http://docs.python.org/2/library/re.html#regular-expression-syntax

>>> re.search('(?P<search_word>^[\.a-zA-Z]*)/?$', 'sitemap.xml').group(0)
'sitemap.xml'
>>>

VS

>>> re.search('(?P<search_word>^(?!sitemap.xml)[\.a-zA-Z]*)/?$', 'sitemap.xml').group(0)
>>>