Отфильтровать строки при наличии в них слова

Есть файл с таким содержанием:

[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
...

Есть такой код

SRC = 'mails.txt'  # Исходный файл
OUT = 'result.txt'  # Отфильтрованный
FILTR = ('@gmail.com',)


def grep_mail_names(src_list, filtr):
    """Возвратит массив имён, содержащих что-либо из filtr"""
    result = []  # Строки удобнее и быстрее собирать в list
    for line in src_list:
        line = line.strip()
        if not line:
            continue
        for d in filtr:
            if d not in line:
                break
        else:
            result.append(line)
    return result



if __name__ == '__main__':

        with open(SRC, 'r') as src_file:
            file_1 = grep_mail_names(src_file.readlines(), FILTR)
        with open(OUT, 'w') as out_file:
            out_file.write('\n'.join(file_1))

В FILTR записываются домены строк, которые нужно оставить и записать в result.txt, но если добавить туда еще какой-нибудь домен, то все ломается. Туплю сильно, никак не могу исправить, что не так?


Ответы (2 шт):

Автор решения: nomnoms12

У Вас неправильная реализация фильтрации:

for d in filtr:
    if d not in line:
        break
else:
    result.append(line)

Ветка else связана с циклом for и будет выполнена, только если цикл завершится без использования break.

То есть значение добавляется в список, если содержит каждую подстроку из FILTR.


Вам же нужно добавить значение, если оно содержит хотя бы одну подстроку:

for d in filtr:
    if d in line:
        result.append(line)
        break
→ Ссылка
Автор решения: asd192
def grep_mail_names(src_list, filtr):
    result = []
    for line in src_list:
        line = line.strip()
        if line[line.index('@'):] in filtr:
            result.append(line)

    return result
→ Ссылка