Если шаблон регулярного выражения обернуть в круглые скобки '()' - мы сгруппируем его.
Такие группы создаются для получения дополнительной информации о них.
- (regex) - обыкновенная скобочная группа
- (?P<name>regex) - обычная скобочная группа, но вместе с номером ей будет присвоено имя name
- (?P=name) - ссылка на именованную группу с именем name - ищет такой же текст, который захватила обычная скобочная группа name
- \1 - ссылка на обычную скобочную группу по номеру (в данном случае - первую)
В регулярных выражениях существуют условия.
Если у группы n нашлись совпадения - возвращается шаблон до '|'.
В противном случае возвращается шаблон после '|'.
Шаблон после '|' необязателен и может быть опущен.
regex = r"(a)?(?(1)b|c)"
# Группа (a)? ищет букву a. К группе применён квантификатор ?, т.к. этой буквы может не быть в тексте
# Если в первой группе нашлась буква a, то условие (?(1)b|c) ищет букву b
# Если первая группа ничего не нашла, то условие ищет букву c
# В данном примере регулярное выражение найдёт все ab и c в тексте
regex = r"^(\[)?\d(?(1)\]|)$" # Выражение для поиска цифры в скобках или без скобок
# Группа (\[)? ищет первую скобку. К группе применён квантификатор ?, т.к. скобки может и не быть
# Условие (?(1)\]|) ищет правую скобку, если в первой группе найдена левая скобка.
# Если первая группа ничего не нашла, то условие ничего не ищет.
# Найдёт 1 и [2]
# Проигнорирует 3] и [4