代码之家  ›  专栏  ›  技术社区  ›  Ghasem

如何使这个regex url模式在django 2中工作?

  •  3
  • Ghasem  · 技术社区  · 7 年前

    我需要制作一个可以使用此URL的URL模式:

    mysite.com/blog/12/بلاگ-مثال
    

    它包含UTF-8字符,所以我尝试使用 \X 以下内容:

    re_path(r'^blog/?P<blog_id>[\d+]+/(?P<slug>[\X.*]+)/$', views.single_blog, name='single_blog')
    

    但它不起作用。我不知道为什么。也许只是因为我不擅长雷吉克斯。所以我尝试了一种不同的模式 .* 接受任何事情:

    re_path(r'^blog/?P<blog_id>[\d+]+/(?P<slug>[.*]+)/$', views.single_blog, name='single_blog')
    

    但这也不管用,我得到:

    当前路径blog/12/_§-_§与这些路径中的任何一条都不匹配。

    所以,正如我提到的,我不擅长瑞格,有什么方法可以解决这个问题?

    是时候说了吗 now I have two problems 还是只有Regex?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Wiktor Stribiżew    7 年前

    从那以后你的匹配方法就不起作用了 \X 不受python支持 re [.*]+ 匹配1+点或星号,但不匹配任何字符(因为 .* 进入之内 [...] 字符类,它们表示文字符号,而不是特殊字符)。

    此外, [\d+]+ 也是与任何数字或 + ,1次或更多次,因此也有问题。

    您可以使用 [^/] 使字符类与任何字符匹配,但 / 以下内容:

    r'^blog/(?P<blog_id>\d+)/(?P<slug>[^/]+)/?$'
    

    细节

    • ^ -开始输入
    • blog/ -字面上的子装备
    • (?P<blog_id>\d+) -“博客ID”组:1+位数字
    • / -A /
    • (?P<slug>[^/]+) -组“slug”:除 /
    • /? -可选 /
    • $ -字符串结尾。

    Here is a regex demo (注意,突出显示阿拉伯语脚本中的字符在那里不起作用。)

        2
  •  2
  •   revo shanwije    7 年前

    现在是时候说我有两个问题了…

    事实上,您已经为此任务选择了正确的工作。

    另一个答案似乎是正确的,但不能容忍有这个词 波斯人 在里面。我发布这个答案是为了说明为什么你自己的regex不能按预期工作。

    1. ?P<blog_id>[\d+]+

    可能您在这里指的是一个命名组,与稍后在regex中使用的组相同。缺少左括号和右括号: (?P<blog_id>[\d+]+) .阿尔索 [\d+] 表示由数字和 + .你需要移除 + 以下内容: (?P<blog_id>[0-9]+)

    1. (?P<slug>[\X.*]+)

    构造应该是好的,但字符类不是。 \X 在字符类中没有特殊的含义,更不用说不支持它的python了。 re 模块偶数。 .* 也不例外。在字符类中,几乎所有的特殊标记都是按字面意思处理的。

    所以 [\X.*] 匹配 X 或者 . 或者一个星号 * .你需要把它改成更一般的 [^/]+ 这意味着匹配到第一个斜杠(=匹配除正斜杠以外的任何内容)。