Django: сопоставить одно или несколько из набора регулярных выражений с ключевым словом в urlconf

У меня есть представление Django, которое принимает три необязательных ключевых аргумента. Я хочу обработать регулярное выражение для сопоставления возможных URL для этого представления в одну строку. Я хочу правильно структурировать URL.

Пример: моими возможными параметрами являются start, который является int, serial, который представляет собой строку длиной 13, и end, который является другим int.

URL может выглядеть так:

/main/s20130509/e20130510/ABC1234567890
or
/main/s20130509/e20130510/
or 
/main/ABC1234567890

Где компоненты с префиксом e и s заканчиваются и начинаются соответственно, а ABC1234567890 - последовательный.

Я хочу вытащить эти значения end, start, serial и передать их в представление как значения start=s20130509 и т. Д.

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

Я пытаюсь сделать что-то вроде:

url(r'^base_url/(?P<serial>[^/]{13}|(?P<end>e\d{8})|(?P<start>s\d{8})/*$', view_method),

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

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

Спасибо за ваше время,

Тим

1 ответ

Решение

То, что вы хотите, это:

url(r'^base_url/(?P<serial>[^/]{13}/$', view_method),

с добавлением дополнительных групп для end а также start Кваргс, так:

# Optional, non-capturing group surrounding the named group for each (so you don't have to capture the slashes or the "e" or "s"
(?:e(?P<end>\d{8})/)

Затем разрешите до 2 из них в любом порядке:

((?:s(?P<start>\d{8})/)|(?:e(?P<end>\d{8})/)){0,2}

Результат:

url(r'^base_url/((?:s(?P<start>\d{8})/)|(?:e(?P<end>\d{8})/)){0,2}(?P<serial>[^/]{13})/$', view_method),

Отказ от ответственности, я написал это в этой коробке, так что мне понадобится время, чтобы проверить это и обновить ответ (если это не так).

Обновить:

Действительно, это сработало:) Я подобрал следующее:

http://127.0.0.1:8080/base_url/e77777777/s88888888/1234567890123/
http://127.0.0.1:8080/base_url/s88888888/e77777777/1234567890123/
http://127.0.0.1:8080/base_url/s88888888/1234567890123/
http://127.0.0.1:8080/base_url/e77777777/1234567890123/
http://127.0.0.1:8080/base_url/1234567890123/

Кварги выглядели так (подняты в исключении из get метод подкласса View по запросу со всеми тремя сегментами - конец и / или начало были None когда не учтено):

{'start': u'88888888', 'serial': u'1234567890123', 'end': u'77777777'}
Другие вопросы по тегам