P. Найдётся всё 3.0

Давайте вновь напишем небольшой компонент поисковой системы.

Формат ввода

Сначала вводится поисковый запрос.
Затем вводятся имена файлов, среди которых следует произвести поиск.

Формат вывода

Выведите все имена файлов, в которых есть поисковая строка без учета регистра и повторяющихся пробельных символов.
Если ни в одном файле информация не была найдена, выведите «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

Решение

В задании несколько «ловушек».

Первое, нужно понимать, что могут встретиться конструкции когда между пробелами окажется ‘&nbsp‘ или ‘\n‘ и их надо корректно отработать.
Второе, при чтении по строкам важно отрезать лидирующие и конечные пробелы с помощью метода strip().
Третье. Нельзя забывать и о том, что содержимое файлов и строку поиска надо привести к одному регистру, а вот имена файлов трогать нельзя — там могут быть буквы в любом регистре.
Четвертое. Если вы знаете как работает поиск, то понимаете, что он ищет слова в любом порядке и допускает наличие любых других слов между искомыми. Так вот. В этой задаче это не так. Слова должны быть ровно в том порядке что даны и наличие между ними других слов недопустимо.

В остальном достаточно заменить все вхождения ‘&nbsp’ на пробел, а потом избавиться от знаков перевода строки и парных пробелов.

Посмотреть код

Решение

Python
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()) 
        ## replace(' ', ' ') на самом деле это replace(' ', ' ')

        if search_for.lower() in data:
            print(file_name)
            found = True

if not found:
    print('404. Not Found')
Подписаться
Уведомить о
guest
12 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Smotri
Smotri
25.12.2024 13:21

В чём смысл replace(‘ ‘, ‘ ‘). ?

Вячеслав
Вячеслав
26.08.2025 13:09

Здравствуйте, помогите понять почему не проходит проверку № 3 «WA»

from sys import stdin

search_query = input()
normal_search_query = search_query.lower()

Flag = False

for file_name in stdin.read().split():

    with open(file_name, encoding=«UTF-8»as file_in:
        line = file_in.read()
        normal_line = » «.join(line.split()).lower()

        result = all(word in normal_line for word in normal_search_query)

        if result:
            print(file_name)
            Flag = True

if not Flag:
    print(«404. Not Found»)

Сергей
Сергей
30.10.2025 13:43

Не могу понять почему вот такой вариант падает на 4 проверке
import re
from sys import stdin

p = input().lower().replace(‘ ‘, »)
f = 1

for line in stdin:
with open(line.rstrip(«\n»), encoding=«UTF-8») as file:
data = file.read().lower()
text = re.sub(r»\s», «», data)
if p in text:
print(line[:-1])
f = 0
if f == 1:
print(‘404. Not Found’)

Сергей
Сергей
Ответить на  Сергей Клочко
30.10.2025 15:31

По поводу вставленного кода извиняюсь, он вставился нормально, не подумал что переформатируется при отправке. Использовать regexp был совет в одной из предыдущих задач, я решил что для этой задачи подходящее решение. re.sub(r»\s», «», data) вроде бы должно было удалить любые пробелы, в том числе переносы строк и табуляцию, если даже он не удаляет &nbsp я пробовал сначала заменить replace(« », » «) потом использовать re.sub(r»\s», «», data). Вроде бы должна была остаться сплошная строка в которой можно искать подстроку, но четвертая проверка почему то не проходит. Приходится именно сплитовать, а потом объединять что бы получить вроде бы такую же сплошную строку.

Сергей
Сергей
Ответить на  Сергей Клочко
30.10.2025 16:23

re.sub(r’\s’… убирает любое количество пробелов. Дело в чем то другом, не понятно в чем )

Сергей
Сергей
Ответить на  Сергей Клочко
31.10.2025 15:53

Спасибо за помощь. Все варианты сравнил и все таки нашел в чем была у меня ошибка. Оказывается проблема вовсе не в строках поиска, а в названии файла. Я для его печати использовал срез «print(line[:-1])», убирая последний перенос появляющийся при вводе через stdin, а в четвертой проверке похоже в названии файла где то лишний пробел и необходимо использовать strip() чтобы результат совпал. Вот мое итоговое решение:

import re
from sys import stdin



p = input().lower().replace(' ', '')
f = 1


for line in stdin:
    with open(line.rstrip('\n'), encoding="UTF-8") as file:
        data = file.read().lower()
        text = re.sub(r"\s", "", data)
        if p in text:
            print(line.strip())
            f = 0
if f == 1:
    print("404. Not Found")