使用正则表达式的多个 url 调度

Posted

技术标签:

【中文标题】使用正则表达式的多个 url 调度【英文标题】:Multiple url dispatches with Regex 【发布时间】:2014-04-15 15:34:40 【问题描述】:

我有两个 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。是否可以按照以下方式进行多次分派?

【问题讨论】:

【参考方案1】:

好问题。 (感谢您在此处发布完整代码。我想现在我知道您在追求什么了。)最简单的解决方案是像这样反转模式:

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'),
)

调度程序在找到匹配项时进行调度。所以如果一个url匹配上面urlpatterns中的r'^sitemap\.xml$,dispatcher就不会继续第二种模式

【讨论】:

我已经忘记了顺序的重要性。再次竖起大拇指! @JavaCake 很高兴为您提供帮助。感谢您在这里发帖。在其上下文中查看代码很有帮助。【参考方案2】:

除了贾斯汀的回答,我想补充一点,在一般情况下,您可以使用负前瞻模式来防止某些字符串匹配。 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'
>>>

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

【讨论】:

以上是关于使用正则表达式的多个 url 调度的主要内容,如果未能解决你的问题,请参考以下文章

获取 Django url 正则表达式中的多个参数

如何使用Cmake字符串正则表达式替换从路径url的多个实例中获取路径url的最后一部分并用它替换整个路径

正则表达式匹配URL

Laravel - 正则表达式路由匹配所有内容,但不完全匹配一个或多个单词

匹配一个网址URL的js正则表达式怎么写啊?

正则表达式匹配URL