Статья Автор: Деникина Н.В., Деникин А.В.

Вопрос 24. Замены и метод split. Арифметическое выражение

ЕГЭ, вопрос 24 · Сложный пример: серия замен для валидации выражения. Нажимайте «Шаг», чтобы увидеть каждую замену.

01 Задача

Файл содержит цифры 0, 6, 7, 8, 9 и знаки - и *. Найти самое длинное корректное арифметическое выражение.

Корректное выражение — это:

✅ Разрешено

Числа из цифр: 96, 0, 700
Знаки между числами: 96*7-80
Ноль как отдельное число: 0*8

❌ Запрещено

Два знака подряд: 9**8, 6-*7
Ведущие нули: 06, 007
Знак на краю: *96, 8-


02 Стратегия замен

Идея: серией замен превращаем строку так, чтобы «плохие» места стали пробелами. Тогда split() разобьёт строку на корректные куски, и останется найти максимальный.

Шаг Замена Зачем
1 ' ' + s + ' ' Пробелы-«часовые» по краям — упрощают обработку знаков на краях
2 6,7,8,9 → '1' Унификация: нас интересует только «ноль / не ноль»
3 '-' → '*' Унификация: оба знака — «операция»
4 '**' → ' ' Два знака подряд → разрыв
5 ' *' → ' ' Знак после пробела (в начале выражения) → разрыв
6 '* ' → ' ' Знак перед пробелом (в конце выражения) → разрыв
7 '*00' → '*0 0' Ведущий ноль после знака: 8*007 → разрыв
8 '*01' → '*0 1' Ведущий ноль после знака: 8*06 → разрыв
9 ' 00' → ' 0' (цикл) Убираем ведущие нули в начале числа: 007 7
10 ' 01' → ' 1' Последний незначащий ноль в начале

03 Код

s = ' ' + s + ' '              # пробелы по краям

for c in "6789":
    s = s.replace(c, '1')     # ненулевые цифры → '1'
s = s.replace('-', '*')       # минус → умножение
s = s.replace("**", ' ')      # два знака → разрыв
s = s.replace(" *", ' ')      # знак после пробела → разрыв
s = s.replace("* ", ' ')      # знак перед пробелом → разрыв
s = s.replace("*00", "*0 0") # ведущий ноль
s = s.replace("*01", "*0 1") # ведущий ноль
while " 00" in s:
    s = s.replace(" 00", " 0")  # убираем ведущие нули
s = s.replace(" 01", " 1")    # последний ноль

print(len(max(s.split(), key=len)))
⚠️ Порядок замен важен! Сначала убираем «грубые» ошибки (двойные знаки, знаки на краях), потом — более тонкие (ведущие нули). Если поменять порядок, результат будет неправильным.

04 Интерактивный разбор

Введите строку из цифр 0, 6, 7, 8, 9 и знаков -, * — и нажимайте «Шаг», чтобы увидеть каждую замену.

Попробуй · пошаговый разбор
Строка
 
 
Нажми «Шаг» или «Запустить»
Скорость:

05 Тесты

💡 СоветСкопируйте любую строку в поле ввода интерактивного разбора выше и посмотрите пошагово, как алгоритм с ней работает. 
Попробуй · тестирование
90*8*007-60*0*96 микс Ответ: ?
*96-70* знаки на краях Ответ: ?
8**7--6*0 двойные знаки Ответ: ?
00097*68-009 ведущие нули Ответ: ?
0*0*0 нули-числа Ответ: ?
006*70-009 ведущие нули Ответ: ?
7 одна цифра Ответ: ?

💡 Нажмите на строку теста — она автоматически подставится в интерактивный разбор


06 Когда использовать?

✅ Подходит

Поиск/удаление запрещённых комбинаций
«Правильные» подстроки из повторяющихся паттернов
Условие выражается через серию замен

💡 Совет

Метод очень мощный и компактный.
Главное — аккуратно продумать порядок замен!
Тестируйте на крайних случаях: 0*0, **, 007


Шпаргалка

Приём Что делает
' ' + s + ' ' Пробелы-часовые: знак на краю станет «знак рядом с пробелом» → легко удалить
6789 → '1' Унификация цифр: важно лишь «ноль или не ноль»
'-' → '*' Унификация знаков: оба — операции
'**' → ' ' Два знака подряд → разрыв
' *' и '* ' → ' ' Знак на краю выражения → разрыв
'*00', '*01' → разрыв Ведущий ноль после знака
while ' 00' Цикл: убираем все ведущие нули в начале числа
max(s.split(), key=len) Финал: самая длинная корректная часть
Печать