2016-01-13 3 views
2

У меня есть набор опока маршрутовПравила для захвата типов и/или параметризованных путями от WERKZEUG правил маршрутизации/КОЛБЫ

/<string:name>/<path:id>/ 
/<name>/<path:id>/ 
/<string:name>/<id>/ 

Я хочу использовать регулярное выражение для извлечения имени и идентификатора

/{name}/{id}/ 
/{name}/{id}/ 
/{name}/{id}/ 

Для всех них (одно регулярное выражение для управления ими всех), для работы с путями, имеющими Тип: путь как /<string:name>/, а также те, как /<name>/

Но я пытаюсь с:

(<(.*?\:)?(.*?)>) 

, который может соответствовать только

/{name}/{id}/ 
/{id}/ # <--- Why this is not matching /{name}/{id}/ 
/{name}/{id}/ 

Любой эксперт REGEX помочь?

Интернет REGEX: https://regex101.com/r/iL3jK2/3
Вопрос: https://github.com/rochacbruno/flasgger/issues/10

+0

Что вы хотите извлечь?Параметры 'name' и' id' будут переданы в вашу функцию просмотра уже, вам не нужно их самостоятельно анализировать. – davidism

+0

@ davidism вы можете увидеть здесь: https: //github.com/rochacbruno/flasgger/issues/10 Это расширение флешки для генерации документации API с чванством, мне нужно выполнить re.sub по набору URL-адресов. –

+0

Не ['(<([^<>] * \:)? ([^ <>] *)>)'] (Https://regex101.com/r/gZ2rV3/1) работает должным образом? –

ответ

2

Я предлагаю использовать

(<([^<>]*:)?([^<>]*)>) 

regex demo is here. Не уверен, что вам действительно нужен внешний (...) (только если вы используете его с re.findall, но вы можете удалить их и использовать re.finditer и получить доступ ко всем матчам, используя match.group(0)).

Пояснение:

  • <([^<>]*:)? - по желанию Группы 2 соответствие
    • < - буквальный <
    • [^<>]* - ноль или больше символов, отличных от < и >
    • : - это буква :
  • ([^<>]*) - Группа 3 соответствие ноль или больше символов, отличных < и >
  • > закрытия >

Ваш шаблон довольно жадный, как .*? спички так много символов, сколько необходимо, чтобы добраться до сначала :. Таким образом, он переходит прямо к id, игнорируя name. При использовании класса отрицательных символов [^<>] мы уверены, что мы не пройдем через > и не сопоставим name внутри первой пары <...>.

+0

Приятно! Он даже работал с большим количеством дорожек. https://regex101.com/r/gZ2rV3/2 –

+0

Я просто удалил избыточное экранирование на \: (<([^<>] *:)? ([^ <>] *)>) –

+0

Да, я сохранил его в своей начальной демонстрации , но ':' не является особым символом, поэтому он может быть неизолирован. –

 Смежные вопросы

  • Нет связанных вопросов^_^