Регулярные выражения в задачах 24 ЕГЭ по информатике
Регулярные выражения, или re, помогают искать, разбивать и заменять фрагменты строки по шаблону. В задачах 24 они особенно полезны, когда нужно работать с большими строками: искать цепочки символов, разрезать строку по запрещённым символам или находить фрагменты определённого вида.
Важно понимать: регулярные выражения не заменяют все методы решения. Иногда лучше использовать два указателя, иногда — split, иногда — обычный перебор. Но знание базовых команд re сильно расширяет набор удобных инструментов.
1. Подключение модуля re
import re
После этого можно использовать функции:
re.split()— разрезать строку по шаблону;re.findall()— найти все подходящие фрагменты;re.finditer()— найти фрагменты вместе с их позициями;re.sub()— заменить фрагменты по шаблону.
2. Сырые строки r'...'
В регулярных выражениях часто используется символ обратного слэша: \. Поэтому шаблоны обычно записывают как «сырые строки»:
pattern = r'\d+'
Буква r перед строкой означает, что Python не будет отдельно обрабатывать обратные слэши. Для задач 24 лучше сразу привыкнуть писать шаблоны именно так.
3. re.split() — разрезать строку по шаблону
Это одна из самых полезных команд для задач 24. Она хорошо подходит, когда в условии есть запрещённые символы.
import re
s = 'ABC123DEF45GHI'
parts = re.split(r'\d+', s)
print(parts)
Результат:
['ABC', 'DEF', 'GHI']
Здесь шаблон r'\d+' означает «одна или несколько цифр подряд». Мы разрезали строку по группам цифр.
Примеры полезных разбиений:
re.split(r'\d+', s) # разрезать по цифрам
re.split(r'[A-F]+', s) # разрезать по буквам от A до F
re.split(r'[K-Z]+', s) # разрезать по буквам от K до Z
4. re.findall() — найти все подходящие фрагменты
Команда findall находит все непересекающиеся фрагменты строки, которые подходят под шаблон.
import re
s = 'AAABBAAAAABB'
parts = re.findall(r'A+', s)
print(parts)
Результат:
['AAA', 'AAAAA']
Шаблон A+ означает «одна или несколько букв A подряд».
5. re.finditer() — найти фрагменты и их позиции
Иногда нужно знать не только сам найденный фрагмент, но и его позицию в строке. Тогда удобно использовать finditer.
import re
s = 'AB123CD456EF'
for m in re.finditer(r'\d+', s):
print(m.group(), m.start(), m.end())
Результат:
123 2 5
456 7 10
m.group()— найденный фрагмент;m.start()— индекс начала;m.end()— индекс позиции после конца.
6. re.sub() — заменить по шаблону
Команда sub заменяет все фрагменты, подходящие под шаблон.
import re
s = 'ABC123DEF45GHI'
s = re.sub(r'\d+', ' ', s)
print(s)
Результат:
ABC DEF GHI
После такой замены удобно сделать обычный split():
parts = s.split()
Такой приём часто используется так:
s = re.sub(r'[A-F]+', ' ', s)
parts = s.split()
7. Квадратные скобки [...]
Квадратные скобки означают: «один символ из набора».
[ABC] # A или B или C
[A-F] # любая буква от A до F
[P-Z] # любая буква от P до Z
[0-9] # любая цифра
[A-Z] # любая заглавная латинская буква
[A-Z0-9] # заглавная буква или цифра
Примеры:
re.findall(r'[A-F]', s) # найти все буквы от A до F
re.split(r'[P-Z]+', s) # разрезать строку по буквам от P до Z
8. Отрицание внутри скобок [^...]
Символ ^ внутри квадратных скобок означает «любой символ, кроме указанных».
[^A] # любой символ, кроме A
[^0-9] # любой символ, кроме цифры
[^A-F] # любой символ, кроме букв от A до F
Пример:
parts = re.findall(r'[^0-9]+', s)
Этот код найдёт все фрагменты, в которых нет цифр.
9. Специальные обозначения
| Шаблон | Что означает |
|---|---|
\d |
любая цифра, то же самое, что [0-9] |
\D |
любой символ, кроме цифры |
. |
любой один символ, кроме перевода строки |
В задачах ЕГЭ лучше часто писать явно: [A-Z], [0-9], [A-F]. Так код понятнее.
10. Квантификаторы: сколько раз повторяется
| Шаблон | Что означает |
|---|---|
+ |
один или больше раз |
* |
ноль или больше раз |
? |
ноль или один раз |
{n} |
ровно n раз |
{n,} |
n или больше раз |
{n,m} |
от n до m раз |
Примеры:
A+ # одна или несколько букв A
\d+ # одна или несколько цифр
[A-F]+ # одна или несколько букв от A до F
A{3} # ровно три буквы A
\d{5} # ровно пять цифр
A{2,5} # от двух до пяти букв A
11. Группы (...) и (?:...)
Круглые скобки позволяют объединять несколько символов в группу. Например:
(AB)+
Это означает: одна или несколько групп AB.
Но в задачах 24 с findall лучше часто использовать незахватывающую группу:
(?:AB)+
Она группирует символы, но не заставляет findall возвращать только содержимое группы.
Пример:
import re
s = 'AB.ABAB.ABABAB'
print(re.findall(r'(?:AB)+', s))
Результат:
['AB', 'ABAB', 'ABABAB']
12. Или: символ |
Вертикальная черта означает «или».
A|B
Это значит: буква A или буква B.
Очень полезный пример — число без ведущих нулей или просто ноль:
number = r'(?:[1-9]\d*|0)'
Этот шаблон означает:
- либо число начинается с цифры от 1 до 9, а потом идут любые цифры;
- либо это просто число 0.
13. Практические шаблоны для задач 24
Только буквы A
pattern = r'A+'
Только цифры
pattern = r'\d+'
Только заглавные латинские буквы
pattern = r'[A-Z]+'
Фрагменты без цифр
pattern = r'\D+'
Фрагменты без букв A-F
pattern = r'[^A-F]+'
Повтор пар AB
pattern = r'(?:AB)+'
Повтор пар «согласная + гласная»
pattern = r'(?:[BCDF][AE])+'
Натуральное число без ведущих нулей или 0
number = r'(?:[1-9]\d*|0)'
Арифметическое выражение с операциями - и *
number = r'(?:[1-9]\d*|0)'
pattern = fr'{number}(?:[-*]{number})*'
14. Просмотр вперёд (?=...)
Обычный findall ищет непересекающиеся фрагменты. Если нужно искать фрагменты, начиная с каждой позиции, можно использовать просмотр вперёд:
import re
s = 'ABABA'
parts = re.findall(r'(?=(ABA))', s)
print(parts)
Результат:
['ABA', 'ABA']
Такой способ позволяет находить пересекающиеся фрагменты. Но использовать его нужно аккуратно: на больших строках он может работать заметно медленнее.
15. Как выбирать метод решения
| Тип условия | Что часто подходит |
|---|---|
| В строке не должно быть некоторых символов | re.split() или re.findall(r'[^...]+', s) |
| Нужно найти фрагмент по чёткому шаблону | re.findall() |
| Нужно заменить неправильные символы | re.sub(), затем split() |
| Нужно считать «ровно», «не менее», «не более» | часто лучше два указателя |
| Нужно найти минимальное окно | часто лучше два указателя |
16. Главное правило
Регулярные выражения удобно использовать, когда нужно:
- разрезать строку по запрещённым символам;
- найти все фрагменты определённого вида;
- заменить группы символов по шаблону;
- коротко описать структуру строки.
Но если в задаче нужно контролировать количество символов внутри окна: ровно 3 буквы, не менее 100 символов, минимальная длина с набором условий, то часто быстрее и надёжнее использовать метод двух указателей.
17. Мини-шпаргалка
import re
re.split(pattern, s) # разрезать строку по шаблону
re.findall(pattern, s) # найти все подходящие фрагменты
re.finditer(pattern, s) # найти фрагменты и их позиции
re.sub(pattern, repl, s) # заменить по шаблону
\d # цифра
\D # не цифра
[A-F] # буква от A до F
[^A-F] # любой символ, кроме A-F
+ # один или больше раз
* # ноль или больше раз
{n} # ровно n раз
| # или
(?:...) # группа без захвата
(?=...) # просмотр вперёд
Хорошая формула для запоминания:
re — чтобы красиво нарезать строку или найти шаблон.
Два указателя — чтобы эффективно искать окно с нужным количеством символов.