2016-09-14 1 views
1

Django 1.10のチュートリアルでは、正規表現の基本的な知識にもかかわらず、正規表現が動的リンクを生成する方法について詳しくは触れていません。私は世論調査/ urls.pyの下で、この特定のスニペットで探しています :DjangoチュートリアルのRegex解釈

url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'), 

は、誰かがその正規表現がどのように解釈されるかについての詳細には触れてもらえますか?キャプチャグループの最初の数値化子、(?P<question_id>はわかりません。特に、Djangoは<question_id>が外部キーであることをどのように知っていますか?

+0

'(?P ...)は、「名前付きキャプチャ」グループの構文のみです。キャプチャグループにインデックスを使用する代わりに、名前を使用できます。明らかに '? 'はここでは限定子ではありません。 –

答えて

2

(?P<question_id>.*)括弧内の正規表現で撮影し、すべてがquestion_idと呼ばれる名前のグループになります言います。それは直接対処することができます。だから、正規表現はそれが外部キーか何かの種類であることを知らない。ちょうどquestion_idという名前のグループがあるということだ。かっこは実際に入ってくる文字列ではマッチしません。

[0-9]+は、1桁以上の数値文字列と一致します。

^は、文字列の先頭です。 $は文字列の最後です。 ^, $, (?P<question_id>, and)は幾分メタですが、文字列の位置や正規表現抽出グループの参照方法などの影響を受けません。

キャプチャされたグループは、キーワード引数としてビュー(この場合は詳細)に渡され、意味のある方法でビューを使用します。

+0

明確化のおかげで、それはそれを 'question_id'と命名することは任意であり、regex文に対して '重要'ではないことを意味しますか? –

+0

私は答えにメモを付けました。ビューに渡されるキーワード引数であるという意味で意味があります。変更した場合は、異なるキーワードargがビューに渡されます。ビューとURLがキーワードに合意されている限り、いずれも動作します。 – nephlm

+0

すごく、私をまっすぐにしてくれてありがとう! –

0

(?P<name>...)は、この正規表現は、番号キャプチャグループである(...)構文とは異なり、という名前のキャプチャグループを有することを意味します。 Djangoは指定されたパラメータを受け取り、それらをあなたのビューに渡します。

0

^(?P<question_id>[0-9]+)/$

^ assert position at start of the string 
(?P<question_id>[0-9]+) Named capturing group "question_id" 
    [0-9]+ match a single character present in the list below: 

     Quantifier: + Between one and unlimited times, as many times as possible, 
     giving back as needed [greedy] 
     0-9 a single character in the range between 0 and 9 

$ assert position at end of the string 

デモと十分な説明:https://regex101.com/r/zV3rZ1/1

0

question_idという名前で[0-9] +をキャプチャします。次に、取得した数値をパラメータとしてビュー関数に渡します。あなたは再機能でそれを試すことができます。 Django固有のものではありません。

>>> import re 
>>> re.match(r'^(?P<question_id>[0-9]+)/$', '122/').groupdict() 
{'question_id': '122'} 
+0

ありがとう、これは文をテストする良い方法です –