Django的`url`模板标签如何反转正则表达式?

时间:2016-10-13 14:36:46

标签: python regex django

Django的url模板标签如何工作?它有什么魔力可以用来“扭转”正则表达式?

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

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

...然后在您的模板中,您可以生成与此模式匹配的网址:

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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