【问题标题】:Regex interpretaion in Django tutorialDjango 教程中的正则表达式解释
【发布时间】:2016-09-14 23:21:50
【问题描述】:

尽管熟悉正则表达式的基础知识,Django 1.10 的教程并没有详细介绍一些正则表达式如何生成动态链接。 我正在 polls/urls.py 下查看这个特定的 sn-p:

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

有人可以详细说明该正则表达式是如何解释的吗?捕获组开头的量词 (?P&lt;question_id&gt; 对我来说没有意义。具体来说,Django 怎么知道&lt;question_id&gt; 是外键?

【问题讨论】:

  • (?P&lt;question_id&gt;...) 只是“命名捕获”组的语法。您可以使用名称,而不是使用捕获组的索引。显然? 不是这里的量词。

标签: python regex django


【解决方案1】:

(?P&lt;question_id&gt;.*) 表示括号内的正则表达式捕获的所有内容都将位于名为 question_id 的命名组中。可以直接解决。所以正则表达式不知道它是外键或类似的东西,只是有一个名为question_id 的组。括号在传入的字符串中并不真正匹配。

[0-9]+ 匹配长度为 1 位或更多位的数字字符串。

^ 是字符串的开头。 $ 是字符串的结尾。 ^, $, (?P&lt;question_id&gt;, and ) 有点元,受字符串的影响不如字符串的位置以及如何引用正则表达式提取的组。

捕获的组作为关键字参数传递给视图(在本例中为详细信息),并由视图以有意义的方式使用它。

【讨论】:

  • 感谢您的澄清,这是否意味着将其命名为 question_id 是任意的,并且与正则表达式语句无关?
  • 我在答案中添加了注释。从某种意义上说,它是传递给视图的关键字参数,这是有意义的。如果您更改它,则会将不同的关键字 arg 传递给视图。只要视图和 url 就关键字达成一致,任何一个都可以工作。
【解决方案2】:

(?P&lt;<em>name</em>&gt;<em>...</em>) 表示此正则表达式有一个命名的捕获组,这与 (...) 语法不同,后者是一个编号的捕获组。 Django 采用命名参数并将它们传递给您的视图。

【讨论】:

    【解决方案3】:

    ^(?P&lt;question_id&gt;[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

    【讨论】:

      【解决方案4】:

      它在名称 question_id 下捕获 [0-9]+。然后它将捕获的数字作为参数传递给视图函数。您可以尝试使用 re 函数。它不是 Django 特定的。

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

      【讨论】:

        猜你喜欢
        • 2013-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-29
        • 2012-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多