регулярное выражение хранения матчей в неправильной группе захвата - PullRequest
0 голосов
/ 02 марта 2019

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

Я хочу сопоставить и захватить следующие случаи:

  1. namespace :: tool_name :: 1.0.1

  2. namespace :: tool_name

  3. tool_name :: 1.0.1

  4. tool_name

Вот регулярное выражение, которое у меня есть:

(?:(?P<namespace>^[^:]+)::)?(?P<name>[^:]*)(?:::(?P<version>[0-9\.]+))?

Это регулярное выражение отлично работает для всех моих 4 тестовых случаев, но проблемаУ меня есть в случае 3, tool_name захватывается в группе пространства имен, а 1.0.1 захватывается в группе имен.Я хотел бы, чтобы они были записаны в правильные группы, имя и версию соответственно

Спасибо

1 Ответ

0 голосов
/ 02 марта 2019

Вы можете сделать часть регулярного выражения tool_name обязательной, заменив * на + (похоже, он всегда присутствует) и ограничив этот шаблон из сопоставления трех разделенных точками цифр с отрицательным прогнозом:

^(?:(?P<namespace>[^:]+)::)?(?!\d+(?:\.\d+){2})(?P<name>[^:]+)(?:::(?P<version>\d+(?:\.\d+){2}))?

См. Демонстрационную версию regex

Подробности

  • ^ - начало строки
  • (?:(?P<namespace>[^:]+)::)? - необязательная группа без захвата, соответствующая любым 1+ символам, отличным от :, в "пространство имен" группы, а затем просто совпадает с ::
  • (?!\d+(?:\.\d+){2}) - отрицательный прогноз, который не позволяет digits.digits.digits шаблон, отображаемый сразу после текущей позиции
  • (?P<name>[^:]+) - «Имя группы»: любые 1 или более символов, кроме :
  • (?:::(?P<version>\d+(?:\.\d+){2}))? - необязательная группа без захватасоответствие ::, а затем группа «версия» захватывает 1+ цифр и 2 повторения . и 1+ цифр.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...