为什么Django没有找到这些url,尽管regex匹配?

2024-09-28 15:06:09 发布

您现在位置:Python中文网/ 问答频道 /正文

在python docs for regex中,有“.”的作用说明:

(Dot.) In the default mode, this matches any character except a newline. If the DOTALL flag has been specified, this matches any character including a newline.

对于我在Django做的一个项目,我设置了以下regex:

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

据我所知,这应该匹配任何以“accounts/confirm/”开头,然后后跟任意数量的任意字符的url。这些任意字符然后作为参数传递给函数“confirm”。到目前为止,还不错。在

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

^{pr2}$

同样好

accounts/confirm/fb75c6529af9246e4e-048d8a4298882909dc03ee0/

以及

accounts/confirm/fb75c6529af9246e4e=048d8a4298882909dc03ee0/

以及

accounts/confirm/fb75c6529af9246e4e%20048d8a4298882909dc03ee0/

至少,这是我所认为的。但它没有,它只匹配第一个。Django一直给我回404分。我不明白,因为表达式的(+)部分应该意味着“匹配除换行符之外的任何字符的一个或多个”。在

编辑: 正如评论和答案所证明的那样,我正确地理解了regex。但问题是,为什么现在返回一个关于Django的观点是不正确的。在把它传递给正则表达式之前,它对url做了一些事情吗?在


Tags: thedjangourldocsfornewlineanythis
1条回答
网友
1楼 · 发布于 2024-09-28 15:06:09

一个快速测试证实了这一点:

>>>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:

^{pr2}$

问题一定出在别处了。在

相关问题 更多 >