Кажется, что
r'^prstatus/(?P<pk>\d+)/(?P<organization>.+)/' + '(?P<repository>.+)/(?P<pr>\d+)/$'
- это регулярное выражение. документация по python для регулярных выражений объясняет:
'*', '+' и '?'все квалификаторы жадные;они соответствуют как можно большему количеству текста.Иногда такое поведение нежелательно;если RE <.*>
сопоставлено с '<a> b <c>'
, оно будет соответствовать всей строке, а не только '<a>'
.Добавление?после того, как квалификатор заставляет его провести матч не жадным или минимальным образом;будет найдено как можно меньше символов.Использование RE <.*?>
будет соответствовать только '<a>'
.
Поскольку .
соответствует любому символу, включая \
, вам необходимо заменить .+
на .+?
Другой вариант - изменить .
на что-то, что лучше отражает, какие символы должны быть сопоставлены.Каждое имя организации и репозитория, о котором я знаю, содержит только буквенно-цифровые символы, символы подчеркивания и пробелы (которые заменяются тире в URL), так что это, вероятно, будет работать:
r'^prstatus/(?P<pk>\d+)/(?P<organization>[\w-]+)/(?P<repository>[\w-]+)/(?P<pr>\d+)/$'