Как мне заставить этот шаблон URL регулярного выражения работать в Django 2 - PullRequest
0 голосов
/ 29 июня 2018

Мне нужно создать шаблон 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 / بلاگ-مثال, не соответствует ни одному из них.

Итак, как я уже говорил, я не очень хорош в регулярных выражениях, как правильно это исправить?

Это правильное время, чтобы сказать теперь у меня две проблемы или регулярное выражение - единственный способ?

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Правильно ли сейчас сказать, что у меня две проблемы ...

Фактически, вы выбрали правильную работу для этой задачи.

Другой ответ кажется правильным, но не может терпеть, чтобы в нем было слово Персидский . Я публикую этот ответ, чтобы объяснить, почему ваше регулярное выражение не работает должным образом.

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

Возможно, вы имели в виду именованную группу, такую ​​же, как та, которую вы использовали позже в регулярном выражении. Вы пропустили открывающие и закрывающие скобки: (?P<blog_id>[\d+]+). Также [\d+] означает класс символов, состоящий из цифр и +. Вам необходимо удалить +: (?P<blog_id>[0-9]+)

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

Конструкция в порядке, но класс персонажей - нет. \X не имеет особого значения в классе символов, не говоря уже о Python, который не поддерживает его даже своим модулем re. .* не является исключением. В классе персонажей почти все специальные токены обрабатываются буквально.

То есть [\X.*] соответствует X или . или звездочке *. Вам нужно изменить его на что-то более общее, например [^/]+, что означает совпадение до первого слеша (= совпадать с любым, кроме слеша).

0 голосов
/ 29 июня 2018

Ваш подход к сопоставлению чего-либо не сработал, поскольку \X не поддерживается Python re, а [.*]+ соответствует 1+ точкам или звездочкам, но не любым символам (поскольку вы вводите .* в [...] символ класс, где они обозначают буквальные символы, а не специальные символы).

Кроме того, [\d+]+ также является классом символов, соответствующим любой цифре или +, 1 или более раз, поэтому также существует проблема.

Вы можете использовать отрицательный класс символов [^/] для сопоставления с любым символом, но /:

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

Детали

  • ^ - начало ввода
  • blog/ - буквальная подстрока
  • (?P<blog_id>\d+) - группа "blog_id": 1+ цифр
  • / - /
  • (?P<slug>[^/]+) - Группа "слизняк": 1+ символов, отличных от /
  • /? - опционально /
  • $ - конец строки.

Вот демоверсия регулярного выражения (примечание, подсвечивающее символы из арабского алфавита там не работает.)

...