Выбор строк, содержащих хотя бы одно ключевое слово

Ищите целые слова, а не подстроки: bar не должно совпасть с abarb. Храните ключи в set и обрабатывайте файл фраз построчно.

Короткий ответ

Что ответить на собеседовании

Ищите целые слова, а не подстроки: bar не должно совпасть с abarb. Храните ключи в set и обрабатывайте файл фраз построчно.

Подробный разбор

Ответ с пояснениями

Условие

Дано:

  1. Файл keywords.txt – список ключевых слов, по одному слову на строку (примерно 1000 строк).
  2. Файл texts.txt – набор фраз, также по одной фразе на строку (около 1 000 000 строк).

Необходимо написать программу, которая формирует новый файл, содержащий только те строки из texts.txt, в которых встречается хотя бы одно слово из keywords.txt.

Пример:

Входные файлы:

keywords.txt:
foo
bar
baz

texts.txt:
aaa bbb ccc
aa foo bb cc dd
aa abarb bb cc
ccc baz xyz zoo

Ожидаемый результат:

aa foo bb cc dd
ccc baz xyz zoo

Ответ

Ищите целые слова, а не подстроки: bar не должно совпасть с abarb. Храните ключи в set и обрабатывайте файл фраз построчно.

Для буквенных ключей и регистрозависимого сопоставления:

import re

with open('keywords.txt', encoding='utf-8') as source:
    keywords = {line.strip() for line in source if line.strip()}

with open('texts.txt', encoding='utf-8') as source, \
     open('result.txt', 'x', encoding='utf-8') as target:
    for line in source:
        words = re.findall(r'[^\W\d_]+', line)
        if any(word in keywords for word in words):
            target.write(line)

В примере сохранятся строки с foo и baz, а abarb не пройдёт. Память ограничена набором ключей и текущей строкой. Правила дефисов, цифр и регистра нужно согласовать с форматом ключей; для регистронезависимого поиска нормализуйте обе стороны.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее