【问题标题】:How does Django's `url` template tag reverse a Regex?Django 的 `url` 模板标签如何反转正则表达式?
【发布时间】:2017-02-22 18:08:15
【问题描述】:

Django 的url 模板标签是如何工作的?它在幕后使用了什么魔法来“反转”正则表达式?

你给它一个这样的正则表达式:

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

...然后在您的模板中,您可以生成一个与该模式匹配的 URL,如下所示:

<a href="{% url 'detail' question.id %}">{{ question.question_text }}</a>

它是如何工作的?通常,正则表达式用于解析文本,而不是生成文本。 re 模块中是否有提供此功能的内置工具?

我的问题不是关于如何使用 Django,或者如何使用正则表达式解析文本。相反,我有兴趣了解如何在其他地方以这种“字符串模板”的方式使用正则表达式。

【问题讨论】:

  • stackoverflow.com/questions/30100870/…not 我的问题的副本,尽管它的标题。这个问题是试图让一些东西在 Django 中正常工作——我不是。
  • 您到底在问什么? urlpatterns 是如何工作的,或者 url 模板标签是如何工作的?
  • url 模板标签的工作原理。我已经很好地理解了通过urlpatterns 解析和分派传入请求的工作原理。我不明白url 模板标签如何能够采用相同的正则表达式并使用它来生成网址。
  • 是的,这正是我正在寻找的东西!很有趣。
  • 哎呀,抱歉删除了我的评论,因为我认为我误解了 url 标签和反向标签的确切原因,但我很确定反向标签是繁重的工作,希望它有帮助无论如何!

标签: python regex django


【解决方案1】:

反转正则表达式的关键是normalize() 函数,它接受一个正则表达式并返回一个可能性列表。每种可能性都是占位符字符串和参数列表的元组。

reverse() 函数首先检查参数是否与占位符的参数列表匹配。如果匹配,占位符字符串将使用传递给reverse() 的参数格式化(使用简单的'string' % parameters)。然后将该字符串与原始正则表达式进行匹配。这是必要的,因为占位符字符串的参数没有任何限制,因此检查原始正则表达式可确保例如\d+ 的组仅包含数字。

如果使用传递参数格式化的字符串与原始正则表达式匹配,则它是有效的 url,并返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 2015-02-01
    • 2011-03-22
    • 2013-07-26
    相关资源
    最近更新 更多