2012-02-02 5 views
0
のDjangoの正規表現

私はunited-states/boulder-21781/tool-&-anchor/mulligan-21/のいずれかのURLを持っています。最高の戦略が&をエンコードすると仮定すると、URLはunited-states/boulder-21781/tool-%26-anchor/mulligan-21/に変更されます。URLが%または&

これを受け入れるURLのconfを作成しようとしていますが、使用している正規表現が機能しません。私は持っています:

url(r'^%(regex)s/%(regex)s-(\d+)/%(regex)s/%(regex)s-(\d+)/$' % {'regex'= '(?i)([\.\-\_\w]+)'}, 'view_tip_page', name='tip_page'), 

%をキャプチャするために追加するものは何ですか?または、ちょうど&を含めるべきですか?

答えて

0

現在のところ、%または&を正規表現にマッチさせる方法はありません。それがエンコードされているかどうかに応じて、正規表現の文字クラスにどちらか一方を追加する必要があります。一致するはずです。

私は次のようにそれを変更する場合があります:

r'(?i)^%(regex)s/%(regex)s-(\d+)/%(regex)s/%(regex)s-(\d+)/$' % {'regex': r'([-.%\w]+)'} 

そして、それが機能することを証明:

>>> pattern = re.compile(r'(?i)^%(regex)s/%(regex)s-(\d+)/%(regex)s/%(regex)s-(\d+)/$' % {'regex': r'([-.%\w]+)'}) 
>>> s = 'united-states/boulder-21781/tool-%26-anchor/mulligan-21/' 
>>> match = pattern.match(s) 
>>> match.groups() 
('united-states', 'boulder', '21781', 'tool-%26-anchor', 'mulligan', '21') 

あなたの正規表現のいくつかのコメント:

(?i)ではありません\wを使用しているので、実際に何かをしています。すでに大文字と小文字の両方に一致します。 (?i)を使用したい場合は、置換文字列とフォーマット文字列(ではなく'...' % {'regex': '(?i)...'}ではなく)に移動します。そうしないと、マルチペット時間が表示されるためです。

注文字クラスは、アンダースコアが\wに含まれているため、これは、[-.%\w][\.\-\_\w]から変更されたこと、それは文字クラスの先頭に来る場合は、ハイフンをエスケープする必要はありませんし、あなたが必要としません文字クラスの内側の.をエスケープする。

あなただけ%(regex)sの代わり%(regex)s-(\d+)を使用することができますが、私は場合には、それは意図的にいくつかの追加の検証を追加されたことを変更したくなかった「岩-21781」のようなものを一致させることは技術的にもそう、\wはマッチ桁を行いますフォーマット。

1

私の最初の勧告は、それをしないことです。あなた自身がデモンストレーションしているように、&が最初の?の前のURIで完全に有効な文字であることを誰もが知っているわけではなく、問題に遭う可能性があります。また、醜い、入力するのが難しい、と言うよりも厄介な、and、またはちょうどn。あなたが本当にがそこにほしいと思うなら、それが文字クラスのそこにそれを入れて、それを言いました。

あなたの質問には関係なく、その正規表現を構築する方法は変です。ビューで使用するパスのビットをキャプチャしていません。また、(?i)グローバル修飾子を4回追加し、すでに\wの一部である_を指定しています。わからない、何かが期待できるだろう

r'(?i)(?P<country>[.\w-]+)/(?P<city>[.\w-]+)-(?P<cityno>[\d+])/...etc... 

多分私は何かが不足しています。

関連する問題