在正则表达式的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进行一些处理?
答案 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
问题必须在其他地方。