2014-04-01 1 views
12

Ich habe ein langes URL-Muster in Django ähnlich wie diese folgen:Wie lange URL-Muster mit Regex spezifizieren, so dass sie PEP8 Richtlinien

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

Definitiv ist es nicht folgen PEP8 Führung als die Charaktere sind mehr als 80 in einer einzigen Zeile.

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

Beide brechen durch Regex: -:

Die erste (mit umgekehrten Schrägstrich): using()

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

Das zweite Ich habe zwei Ansatz zur Lösung dieses gefunden. Gibt es einen besseren Ansatz, um dieses Problem zu lösen? ODER Ist es eine schlechte Übung, so lange Regex für URLs zu schreiben?

Antwort

20

Angrenzend Strings werden verkettet, so dass man etwas tun kann:

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

Erläuterung: Sie sind in Klammern * verkettet. –

+2

Das ist die Situation in diesem Fall, aber sie sind nicht * nur * in Klammern verkettet. Probieren Sie 's =" foo "" bar "' in der interaktiven Shell aus. – khagler

+0

Danke für die Idee, jeden Slug in verschiedenen Linien zu zerbrechen. Es macht den Code lesbarer. –

-2

PEP8 hat keine regex Formatierung Tipps. Aber diese:

  • Verwendung re.compile und haben diese Vorteile
    • schneller anzupassen/Suche auf sie
    • verweisen sie unter einem (kurzen) Namen!
  • schreiben die Regex mehrzeilige mit (weiß) Räume
    • Verwendung re.VERBOSE Flags Leerzeichen in der Regex String
    • Verwendung anstelle von „Magie Gruppen“ ((?i) → re.IGNORECASE)
  • zu ignorieren

 

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', ...) 
+1

URL Regexs werden vom Framework Django kompiliert – dalore

Verwandte Themen