如何使用Regex指定长URL模式,以便它们遵循PEP8指南

时间:2014-04-01 02:26:03

标签: python django pep8

我在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'),  

他们两个都被正则表达式打破。有没有更好的方法来解决这个问题。或者为网址编写如此长的正则表达式是不好的做法。

2 个答案:

答案 0 :(得分:22)

相邻的字符串是连接的,所以你可以这样做:

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

答案 1 :(得分:-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', ...)