3

正規表現のPythonドキュメントには、「。」の説明があります。します:

(ドット)デフォルトモードでは、これは改行を除くすべての文字に一致します。DOTALLフラグが指定されている場合、これは改行を含むすべての文字に一致します。

Djangoで行うプロジェクトの場合、次の正規表現を設定します。

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

私が理解している限り、これは「accounts / confirm /」で始まり、その後に任意の数の任意の文字が続くすべてのURLと一致する必要があります。これらの任意の文字は、パラメータとして関数「確認」に渡されます。ここまでは順調ですね。

したがって、この正規表現は一致する必要があります

accounts/confirm/fb75c6529af9246e4e048d8a4298882909dc03ee0/

同様に

accounts/confirm/fb75c6529af9246e4e-048d8a4298882909dc03ee0/

accounts/confirm/fb75c6529af9246e4e=048d8a4298882909dc03ee0/

accounts/confirm/fb75c6529af9246e4e%20048d8a4298882909dc03ee0/

少なくとも、それは私がそれがするだろうと思ったことでした。しかし、そうではなく、最初のものだけに一致します。Djangoは他のものに404を返し続けます。式の(。+)部分は、「改行以外の任意の文字の1つ以上の鉱石に一致する」ことを意味する必要があるため、私にはわかりません。

編集: コメントと回答が証明されたように、私は正規表現を正しく理解しました。だから、これは今の質問です:なぜDjangoは正しいビューを返さないのですか?しかし404です。それはその正規表現に渡す前に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 に答える