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

mar*_*rue 3 python regex django

在正则表达式的python文档中,有"."的描述.作用:

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

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

url(r'^accounts/confirm/(.+)$', confirm,name='confirmation_view')
Run Code Online (Sandbox Code Playgroud)

据我所知,这应该匹配任何以'accounts/confirm /'开头的网址,然后是任意数量的任意字符.然后将这些任意字符作为参数传递给函数"confirm".到现在为止还挺好.

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

accounts/confirm/fb75c6529af9246e4e048d8a4298882909dc03ee0/
Run Code Online (Sandbox Code Playgroud)

同样如此

accounts/confirm/fb75c6529af9246e4e-048d8a4298882909dc03ee0/
Run Code Online (Sandbox Code Playgroud)

accounts/confirm/fb75c6529af9246e4e=048d8a4298882909dc03ee0/
Run Code Online (Sandbox Code Playgroud)

accounts/confirm/fb75c6529af9246e4e%20048d8a4298882909dc03ee0/
Run Code Online (Sandbox Code Playgroud)

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

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

Gar*_*tty 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
Run Code Online (Sandbox Code Playgroud)

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

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

问题必须在其他地方.