Top.Mail.Ru
Ответы

Питон. регулярные выражения. не могу понять некоторые моменты

arr = findall(r'(?:0|[789][0789]*)(?:[*\-](?:0|[789][0789]*))*', s)
например вот в такой строке что означает вот эта часть ?:0|

По дате
По рейтингу
Аватар пользователя
Новичок
2мес

Четвертый ГПТ ответил так:
===============================
В регулярном выражении (?: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
====================

Аватар пользователя
Высший разум
2мес

Вот что написано про это на их официальном сайте:

(?:...)

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.

Аватар пользователя
Ученик
2мес

ку