Python Regexp неправильное выражение

Рейтинг: 0Ответов: 2Опубликовано: 20.01.2023

Задача гласит:

Текстовый файл содержит только заглавные буквы латинского алфавита (ABC…Z). Определите количество групп из идущих подряд не менее 12 символов, которые начинаются и заканчиваются буквой E и не содержат других букв E (кроме первой и последней) и букв F.

Для выполнения этого задания следует написать программу. Ниже приведён файл, который необходимо обработать с помощью данного алгоритма.

Ссылка на файл онклик

Написал код:

import re

with open("24.txt") as file:
    readyLines = re.findall("E[^FE]*E", file.readline())
    print(len(readyLines))

Ответ (14100) не совпадает с правильным (9655) Неправильная регулярка?

UPD1:

Итак, благодаря комментариям стало понятно, что способ, который я использовал (Помимо, ошибочной регулярки) был неверным. Фильтрация по длине, даже с регуляркой
"E[^FE]*(?=E)" была бы неверной. Поскольку, как и указал мистер @CrazyElf , не отберёт все необходимые выражения.
(UPD2)

Но основной ошибкой было неиспользование "lookahead assertion" (?=...), позволяющей не "забывать" использовать E как начало новой подстроки.

Итоговый, работающий код:

import re

with open("24.txt") as file:
    readyLines = re.findall("E[^FE]{10,}(?=E)", file.readline())
    print(len(readyLines))

--> 9655

UPD2:
Чтож, фильтрация была бы верной, в отличии от написанного мною в первом апдейте, но нужно было бы учитывать факт отсутствия последней буквы E, поэтому код выглядел бы именно так:

import re

with open("24.txt") as file:
    readyLines = re.findall("E[^FE]*(?=E)", file.readline())
    print(len([x for x in readyLines if len(x) >= 11]))

 

Ответы

▲ 1Принят

Правильный ответ 9655 можно получить, если сделать две вещи:

  • правильно написать квантифаер для кол-ва символов с помощью {...}
  • сделать так, чтобы учитывались и те группы, которые начинаются с того E, которым заканчивается предыдущая группа, это делается с помощью "positive lookahead" (?=...) для последнего E

Второй пункт из текста задания совсем не очевиден, но он позволяет получить правильный ответ.

▲ 1

В регулярках можно написать {n,} - это значит "повторить n или более раз".

PS: Я запустил вашу программу с таким выражением, и она вывела 7858.