Давайте вновь напишем небольшой компонент поисковой системы.
Формат ввода
Сначала вводится поисковый запрос.
Затем вводятся имена файлов, среди которых следует произвести поиск.
Формат вывода
Выведите все имена файлов, в которых есть поисковая строка без учета регистра и повторяющихся пробельных символов.
Если ни в одном файле информация не была найдена, выведите “404. Not Found
“.
Примечание
Система поиска должна обрабатывать строки "a b"
, "a b"
и "a\nb"
как одинаковые.
Пример
Ввод
# Пользовательский ввод:
Мама мыла РАМУ
first.txt
second.txt
# Содержимое файла first.txt
В этом файле говорится о том что МАМА
мылА
Раму
# Содержимое файла second.txt
А в этом не говорится
Вывод
first.txt
Ввод
# Пользовательский ввод:
Python
only_one_file.txt
# Содержимое файла only_one_file.txt
Тут нет никаких змей
Вывод
404. Not Found
Решение
В задании несколько “ловушек”.
Первое, нужно понимать, что могут встретиться конструкции когда между пробелами окажется ‘ ‘ или ‘\n‘ и их надо корректно отработать.
Второе, при чтении по строкам важно отрезать лидирующие и конечные пробелы с помощью метода strip().
Третье. Нельзя забывать и о том, что содержимое файлов и строку поиска надо привести к одному регистру, а вот имена файлов трогать нельзя – там могут быть буквы в любом регистре.
Четвертое. Если вы знаете как работает поиск, то понимаете, что он ищет слова в любом порядке и допускает наличие любых других слов между искомыми. Так вот. В этой задаче это не так. Слова должны быть ровно в том порядке что даны и наличие между ними других слов недопустимо.
В остальном достаточно заменить все вхождения ‘ ’ на пробел, а потом избавиться от знаков перевода строки и парных пробелов.
Посмотреть код
Решение
from sys import stdin
search_for, *file_names = [string.strip() for string in stdin]
found = False
for file_name in file_names:
with open(file_name, encoding='UTF-8') as file:
data = ' '.join(file.read().replace(' ', ' ').lower().split())
if search_for.lower() in data:
print(file_name)
found = True
if not found:
print('404. Not Found')