Как использовать именованный захват регулярных выражений до ИЛИ после не перехватывающей группы, когда именованные группы захвата нельзя использовать дважды?

Я использую регулярное выражение в скрипте Python для захвата именованной группы. Группа появляется перед ИЛИ после строки-разделителя "S". Моя путаница возникает из-за невозможности использовать именованные группы захвата дважды в одном и том же регулярном выражении.

Я хотел бы использовать следующее недопустимое (именованная группа использовалась дважды) регулярное выражение:

(?:^STD_S_)(?P<important>.+?)$|(?:^(?P<important>.+?)(?:STD_S_)$

Описание:

?: non-capture group ^STD_S_ Starting with some "STD_S_" string which is a standard string plus a delimiter

?P Named important string I want

| OR

^?P stat with important STS_S_$ end with standard

Мне бы очень хотелось, чтобы важная группа, которую я захватил, была названа. Я могу удалить имена и заставить это работать. Я также могу разделить одно выражение на два выражения (по одному с каждой стороны от ИЛИ) и выполнить поиск, чтобы выбрать, какое из них использовать с некоторым именем входа в скрипте python.

Спасибо!

ПРИМЕРНЫЕ ВХОДЫ

STD_S_important
important_S_STD

ПРИМЕРНЫЕ РЕЗУЛЬТАТЫ

important #returned by calling the important named group
important

регулярное выражение на основе комментариев, которые не соответствуют второму случаю.

(?:(?:^STD_S_)(?P<important>.+?)$)|(?:^(?P=important)(?:_S_STD)$)

1 ответ

Обратите внимание, что общая форма регулярного выражения:A(?P<name>B)|(?P<name>B)C. Поскольку имя не может повторяться для именованных групп, оно должно охватывать все выражение. Это вызывает другую проблему: он захватывает префикс и суффикс в именованной группе. Чтобы решить эту проблему, вы можете использовать обходные пути , чтобы предотвратить захват префикса и суффикса в группе.

      (?P<name>(?<=A)B|B(?=C))

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

      # can succeed:
(?P<name>(?<=^A)B$|^B(?=C$))

# always fails:
(?P<name>^(?<=A)B$|^B(?=C)$)
^(?P<name>(?<=A)B|B(?=C))$

Для рассматриваемого регулярного выражения это дает:

      (?P<important>(?<=^STD_S_).+$|^.+(?=_S_STD$))

(демонстрация RegEx101)

Кроме того, модуль регулярного выражения позволяет использовать одно и то же имя группы для нескольких групп, при этом последний захват имеет приоритет.

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