Ищите целые слова, а не подстроки: bar не должно совпасть с abarb. Храните ключи в set и обрабатывайте файл фраз построчно.
Выбор строк, содержащих хотя бы одно ключевое слово
Ищите целые слова, а не подстроки: bar не должно совпасть с abarb. Храните ключи в set и обрабатывайте файл фраз построчно.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дано:
- Файл keywords.txt – список ключевых слов, по одному слову на строку (примерно 1000 строк).
- Файл 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 не пройдёт. Память ограничена набором ключей и текущей строкой. Правила дефисов, цифр и регистра нужно согласовать с форматом ключей; для регистронезависимого поиска нормализуйте обе стороны.