【问题标题】:Why is this regex code not working为什么这个正则表达式代码不起作用
【发布时间】:2018-04-01 17:58:07
【问题描述】:

在 Django 应用上工作

这是我的 urls.py

urlpattterns = [url(r'^(?P<leagueId>[0-9]+)/(?P<year>[0-9]+)/(?P<team>[\S]+)/$', views.team_detail, name="team_detail"),]

示例网址如下:

http://localhost:8000/123456/2017/Johnny%20Rocket/

我尝试过使用 Pythex,但我无法获得匹配的网址

注意:传递的变量是/{number}/{year}/{name}

名称可以由字母数字字符和空格组成。

【问题讨论】:

  • 但是%20 是空格的编码...改用.+
  • 我猜很多流量来自 [django] 以外的标签。在字符串与正则表达式匹配之前,Django 将提取 url 路径和第一个斜杠的剪切。

标签: python regex django django-views django-urls


【解决方案1】:

我会使用以下正则表达式:

r"(?P<leagueId>\d+)/(?P<year>\d+)/(?P<team>[^/]+)/$"

一些小改动:

  • 取出表示行首的^
  • 将 [0-9] 更改为 \d

但最重要的是部分。我喜欢使用否定字符类。您基本上希望将所有内容匹配到下一个

/

就是这样

[^/]+

会为你做的。

您可能希望将年份限制在如下范围内:

\d{2,4}

【讨论】:

  • 在 Django 的上下文中,在开头添加斜线实际上是不正确的。路径被提取、解码,并在字符串与正则表达式匹配之前切断第一个斜杠。
【解决方案2】:

字符类\S 匹配除空格以外的任何内容,%20 在与正则表达式匹配之前被解码为空格。

要匹配字母数字字符和空格,您可以使用[\w\s]

【讨论】:

    猜你喜欢
    • 2013-12-05
    • 1970-01-01
    • 2013-05-18
    相关资源
    最近更新 更多