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

标签 python regex django

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 或如何使用 Regex 解析文本。相反,我有兴趣学习如何在其他地方以这种“字符串模板”方式使用正则表达式。

最佳答案

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

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

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

关于python - Django 的 `url` 模板标签如何反转正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40024017/

相关文章:

python - MySQL 和 python-mysql (mysqldb) 在重负载下崩溃

regex - 使用正则表达式和 ffmpeg 获取视频的长度

python - Django:尝试使用来自 GitHub 的 django-audiofield 时导入错误

python - 没有外键错误的django中间模型

python - 如何在python列表中的特定索引处插入元素

Python多处理.进程: start with local variable

python - 更新 Django 站点时如何维护用户数据?

javascript - 查找多个带引号的字符串

python - 仅替换模式中的第二次出现

python - Django错误: 'myproject.wsgi.application' could not be loaded