Необязательная именованная группа захвата с суффиксом - PullRequest
3 голосов
/ 29 марта 2020

У меня есть спецификация команды

RENAME_SECTION file::section [new_file::]new_section

file, section и new_section обязательны, new_file необязательны.

Чем означает, что все следующие выражения будут совпадать:

RENAME_SECTION io.cfg::BUS1 io.cfg::BUS3
RENAME_SECTION io.cfg::BUS2       io_new.cfg::BUS2
RENAME_SECTION io.cfg::VID VID1

Я пытаюсь получить все предоставленные параметры с Python re.search(pattern, config_line), используя шаблон

(?P<command>RENAME_SECTION\s)\s*(?P<file>\S+)::(?P<section>.*)\s+(?P<target_file>\S*)[::]?(?P<target_section>.*)

Этот шаблон соответствует двум первым случаям, но не третьему, причина в отсутствии последних ::.

Как можно связать :: с target_file именованной группой захвата?

Ответы [ 2 ]

2 голосов
/ 29 марта 2020

Вы можете попробовать это регулярное выражение с необязательным совпадением и якорями:

^(?P<command>RENAME_SECTION)\s+(?P<file>\S+?)::(?P<section>\S+)\s+(?:(?P<target_file>\S+?)::)?(?P<target_section>.+)$

RegEx Demo

(?:(?P<target_file>\S+?)::)? - необязательная группа без захвата, которая делает соответствие target_file и конечный :: необязательно .

2 голосов
/ 29 марта 2020

Вы можете рассмотреть шаблон, подобный

(?P<command>RENAME_SECTION)\s+(?P<file>\S+)::(?P<section>\S+)\s+(?:(?P<target_file>[^\s:]+)::)?(?P<target_section>\S+)

См. Демонстрационную версию regex . Если вы планируете сопоставить целую строку с шаблоном, добавьте ^ в начале и $ в конце.

Подробности

  • (?P<command>RENAME_SECTION) - RENAME_SECTION строка
  • \s+ - 1+ пробелов
  • (?P<file>\S+) - 1+ непробельных символов
  • :: - a :: подстрока
  • (?P<section>\S+) - 1+ без пробелов
  • \s+ - 1+ пробелов
  • (?:(?P<target_file>[^\s:]+)::)? - необязательная группа, соответствующая 1 или 0 вхождениям
    • [^\s:]+ - 1+ символов кроме пробелов и : символов
    • :: - :: подстрока
  • (?P<target_section>\S+) - 1+ без пробелов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...