Как указать длинные шаблоны url с использованием Regex, чтобы они соответствовали рекомендациям PEP8

У меня длинный шаблон url в Django, подобный этому:

url(r'^(?i)top-dir/(?P<first_slug>[-\w]+?)/(?P<second_slug>[-\w]+?)/(?P<third_slug>[-\w]+?).html/$',
    'apps.Discussion.views.pricing',

Определенно это не соответствует руководству PEP8, так как символы более 80 в одной строке. Я нашел два подхода к решению этого вопроса:

Первый (с использованием обратной косой черты):

   url(r'^(?i)top-dir/(?P<first_slug>[-\w]+?)/(?P<second_slug>[-\w]+?)'\
       '/(?P<third_slug>[-\w]+?).html/$',
       'apps.Discussion.views.pricing',

Второй - используя():

 url((r'^(?i)top-dir/(?P<first_slug>[-\w]+?)/(?P<second_slug>[-\w]+?)',
      r'/(?P<third_slug>[-\w]+?).html/$'),
      'apps.Discussion.views.pricing'),  

Оба они ломаются по Regex. Есть ли лучший подход для решения этой проблемы. ИЛИ Неправильно ли писать такое длинное Regex для URL-адресов.

Ответ 1

Смежные строки конкатенированы, поэтому вы можете сделать что-то вроде этого:

url(r'^(?i)top-dir/(?P<first_slug>[-\w]+?)/'
    r'(?P<second_slug>[-\w]+?)/'
    r'(?P<third_slug>[-\w]+?).html/$',
    'apps.Discussion.views.pricing',)

Ответ 2

PEP8 не имеет подсказок форматирования регулярных выражений. Но попробуйте следующее:

  • используйте re.compile и получайте эти преимущества
    • быстрее совместить/искать на них
    • ссылайтесь на них под (коротким) именем!
  • пишите многолистное выражение с (белыми) пробелами
    • используйте re.VERBOSE, чтобы игнорировать пробелы в строке регулярного выражения.
    • использовать флаги вместо "магических групп" ((?i) → re.IGNORECASE)

 

slugs = re.compile(r'''
    ^
    top-dir/
    (?P<first_slug>[-\w]+?)/
    (?P<second_slug>[-\w]+?)/
    (?P<third_slug>[-\w]+?).html/
    $
        ''', re.VERBOSE|re.IGNORECASE)

url(slugs, 'apps.Discussion.views.pricing', ...)