尽管正则表达式匹配,为什么Django找不到这些网址?

时间:2012-04-08 21:55:40

标签: python regex django

在正则表达式的python文档中,有“。”的描述。作用:

  

(点。)在默认模式下,它匹配除a以外的任何字符   新队。如果指定了DOTALL标志,则匹配任何标志   字符包括换行符。

对于我在Django中进行的项目,我设置了这个正则表达式:

url(r'^accounts/confirm/(.+)$', confirm,name='confirmation_view')

据我所知,这应该匹配任何以'accounts / confirm /'开头的网址,然后跟随任意数量的任意字符。然后将这些任意字符作为参数传递给函数“confirm”。到目前为止,非常好。

所以这个正则表达式应该匹配

accounts/confirm/fb75c6529af9246e4e048d8a4298882909dc03ee0/

一样
accounts/confirm/fb75c6529af9246e4e-048d8a4298882909dc03ee0/

accounts/confirm/fb75c6529af9246e4e=048d8a4298882909dc03ee0/

accounts/confirm/fb75c6529af9246e4e%20048d8a4298882909dc03ee0/

至少,这是我认为会做的事情。但它没有,它只匹配第一个。 Django一直让我回到404。我不明白,因为表达式的(。+)部分应该表示“匹配除换行符之外的任何字符的一个或多个”。

修改 正如评论和答案所证明的那样,我得到了正则表达式。所以现在这是一个问题:为什么Django没有返回正确的视图,而是404.在将它传递给该正则表达式之前它是否正在对URL进行一些处理?

1 个答案:

答案 0 :(得分:8)

快速测试证实这应该有效:

>>>import re
>>>test = ["accounts/confirm/fb75c6529af9246e4e048d8a4298882909dc03ee0/", "accounts/confirm/fb75c6529af9246e4e-048d8a4298882909dc03ee0/", "accounts/confirm/fb75c6529af9246e4e=048d8a4298882909dc03ee0/", "accounts/confirm/fb75c6529af9246e4e%20048d8a4298882909dc03ee0/"]
>>>all([re.match(r'^accounts/confirm/(.+)$', item) for item in test])
True

这将在任何非匹配上返回false:

>>>test.append("something else")
>>>all([re.match(r'^accounts/confirm/(.+)$', item) for item in test])
False

问题必须在其他地方。