在 regex 的 python 文档中有关于“.”的描述。做:
(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 中做的一个项目,我设置了这个正则表达式:
url(r'^accounts/confirm/(.+)$', confirm,name='confirmation_view')
据我所知,这应该匹配任何以“accounts/confirm/”开头,然后是任意数量的任意字符的 url。然后将这些任意字符作为参数传递给函数“confirm”。到目前为止,还不错。
所以这个正则表达式应该匹配
accounts/confirm/fb75c6529af9246e4e048d8a4298882909dc03ee0/
和
一样accounts/confirm/fb75c6529af9246e4e-048d8a4298882909dc03ee0/
和
accounts/confirm/fb75c6529af9246e4e=048d8a4298882909dc03ee0/
和
accounts/confirm/fb75c6529af9246e4e%20048d8a4298882909dc03ee0/
至少,这是我认为它会做的。但它没有,它只匹配第一个。 Django 不断给我返回 404 其他的。我不明白,因为表达式的 (.+) 部分应该表示“匹配一个或多个除换行符之外的任何字符”。
编辑: 正如评论和答案所证明的那样,我的正则表达式是正确的。所以现在这是一个问题:为什么 Django 没有返回正确的 View ,而是返回 404。在将 url 传递给该正则表达式之前,它是否对 url 做了一些事情?
最佳答案
快速测试确认这应该有效:
>>>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
问题一定出在别处。
关于python - 为什么 Django 找不到这些 url,尽管正则表达式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10066891/