3

在 regex 的 python 文档中,有对“。”的描述。做:

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

对于我在 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 没有返回正确的视图,而是 404。在将 url 传递给该正则表达式之前,它是否对 url 做了一些事情?

4

1 回答 1

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

问题一定出在其他地方。

于 2012-04-08T22:01:43.840 回答