Питон. регулярные выражения. не могу понять некоторые моменты
arr = findall(r'(?:0|[789][0789]*)(?:[*\-](?:0|[789][0789]*))*', s)
например вот в такой строке что означает вот эта часть ?:0|
Четвертый ГПТ ответил так:
===============================
В регулярном выражении (?:0|[789][0789]*) часть ?: означает "негруппирующая скобочная группа" (non-capturing group).
Разберём по частям:
(?:...) — негруппирующая группа
В отличие от обычных скобок (...), которые создают запоминающую группу (и результаты таких групп можно потом использовать, например, через group(1)), конструкция (?:...) группирует выражение, но не сохраняет его в отдельную группу.
Это полезно, если тебе нужно использовать скобки только для логики, например, с оператором | (или), но ты не хочешь, чтобы группа попадала в результат.
0|[789][0789]*
Это означает:
0 — просто ноль
ИЛИ
[789][0789]* — число, которое начинается с 7, 8 или 9, и за которым могут следовать ноль или более цифр из множества 0, 7, 8, 9
Вместе: (?:0|[789][0789]*)
Это либо:
просто 0
либо число, начинающееся с 7, 8 или 9, и состоящее только из цифр 0, 7, 8, 9
А благодаря ?: эта логика не будет записана в отдельную запоминаемую группу.
Разбираем всё регулярное выражение по частям:
r'(?:0|[789][0789]*)(?:[*\-](?:0|[789][0789]*))*'
Это выражение ищет строки, состоящие из определённого набора чисел, разделённых * или -, где каждое число — это либо 0, либо число из цифр 7, 8, 9, 0, начинающееся на 7, 8 или 9.
1. (?:0|[789][0789]*)
Что ищет:
Либо 0
Либо число, начинающееся с 7, 8 или 9, за которым следуют ноль или более цифр из 0, 7, 8, 9
Примеры: 7, 70, 889, 9080, 9, 0
2. (?:[*\-](?:0|[789][0789]*))*
Это повторяющаяся часть, которая может встречаться ноль или более раз.
Разберём:
(?:...) — снова негруппирующая группа
[*\-] — один символ: * или -
здесь \ — экранирование, потому что - внутри [] обычно обозначает диапазон
(?:0|[789][0789]*) — как и выше: либо 0, либо "789-цифровое" число
Примеры подходящих под это выражение:
7
7*8
7-9
7*8-0
0
0-0
8*9*70
3. Всё выражение целиком:
(?:0|[789][0789]*)(?:[*\-](?:0|[789][0789]*))*
Оно означает:
👉 Найди строку, которая начинается с 0 или "789-цифрового" числа,
👉 за которым может идти любое количество таких же чисел, разделённых * или -.
Примеры строк, которые подойдут:
7
8-7
9*70-0
0
0*0*0
7*7*8-9
====================
Вот что написано про это на их официальном сайте:
(?:...)
A non-capturing version of regular parentheses. Matches whatever regular expression is inside the parentheses, but the substring matched by the group cannot be retrieved after performing a match or referenced later in the pattern.
т.е. получается, что при совпадении и срабатывании вы потом НЕ можете выдернуть эти группы для разбора.
Тут конкретно получается, что будет срабатывать на 0 или на пару цифр после от 7 до 9.
ку