Отображение URL Regex на веб-сервере торнадо

Я использую веб-сервер торнадо для моего приложения.

Ниже приведен один из URL-адресов, сопоставленных с обработчиком.

from publish.handler import PublishHandler, PublishedHandler

URLS = [(r'/public/project/(?P<project>.*?)/?$', PublishHandler),
        (r'/stitchemapp-public/project/(?P<project>.*?)/version/(?P<version>v\d{1,}.*)/image/(?P<image>.*?)/$',
                                                    PublishedHandler),
    ]

Весь импорт и вызов обработчика происходит нормально.

Но некоторая проблема с генерированием kwargs из второго кортежа URL-адресов в списке URLS. Когда я делаю

print kwargs

это печатает:

{'project': u'clearsoup', 'version': u'v2/image/project_home_page_v1.jpg'}

Но я ожидаю:

{'project': u'clearsoup', 'version': u'v2', 'image': 'project_home_page_v1.jpg'}

Где я делаю неправильно. Я всегда могу написать хаки, чтобы получить точную информацию от kwargs, которую получает обработчик, но это не правильный путь.

Пожалуйста, предложите мне, где я делаю неправильно.

Заранее спасибо за помощь.

1 ответ

Я знаю, что это очень старо, но это так же просто, как регулярное выражение версии использует жадный квантификатор. Согласно документации Python:

"The" , "+" и "?" все квалификаторы являются жадными, они соответствуют как можно большему количеству текста. Иногда такое поведение нежелательно; если RE <. > сопоставляется с b, оно будет соответствовать всей строке, а не только. Добавление? после того, как квалификатор сделает это выполнять сопоставление не жадным или минимальным образом; будет сопоставлено как можно меньше символов. Использование RE <.*?> будет соответствовать только."

Итак, чтобы исправить, замените.* На.*?.

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

Другие вопросы по тегам