У меня есть следующий текстовый файл:
We are playing football at World Cup
teste
We are playing football
Playing test
World Cup Football
И я хочу извлечь только строки, содержащие (Чемпионат мира и Футбол) или ('Игра', 'тест').
Например, на основе моего текстового файла я хочу извлечь только это:
We are playing football at World Cup
Playing test
World Cup Footbal
В основном я хочу извлечь, только если строка содержит два значения из каждого кортежа.
Для этого я пробую следующий код:
file = 'text.txt'
words = [('Football','World Cup'), ('Playing test ')]
with open(file, "r") as ins:
for line in ins:
if all(x in line.lower() for x in words):
print(line)
Но с моим кодом у меня возникает следующая ошибка:
TypeError: 'in <string>' requires string as left operand, not tuple
Как я могу это сделать?
Спасибо
Вы были очень близки, вам просто нужен был еще один цикл:
file = 'text.txt'
words = [('Football','World Cup'), ('Playing test ')]
with open(file, "r") as ins:
for line in ins:
for tup in words:
if all(word.lower() in line.lower() for word in tup):
print(line)
Вы можете попробовать с комбинацией any
и all
:
if any(all(words.lower() in line.lower() for words in word_tuples) for word_tuples in words)
Вы можете отметить любое из списка слов и все из пунктов списка.
(Тестирование без файла)
# Note: second element needs to be tuple else causes unexpected results
words = [('Football','World Cup'), ('Playing test',)]
ins = ["We are playing football at World Cup",
"teste",
"We are playing football",
"Playing test",
"World Cup Football"]
for line in ins:
if any(all(words.lower() in line.lower() for words in word_tuples) for word_tuples in words):
print(line)
Выход:
We are playing football at World Cup
Playing test
World Cup Football
Как упоминалось в комментарии ниже, если второй элемент не является кортежем, это приводит к неожиданному результату. Используя тестовый пример, ниже показана ошибка при сравнении, если все символы совпадают, а не слова:
x = "test palying"
if all(w.lower() in x for w in words[1]):
print("ERROR")
Как работает ваш код, когда второй элемент слов не является кортежем. Также в коде оператора есть двусмысленность, поскольку он говорит две вещи об этом втором элементе.
@Vicrobot Спасибо! Я этого не понимал. Я думаю, что это приводит к неожиданному результату, поэтому для исправления второго элемента также необходимо tuple
, т.е. ('Playing test',)
Ваш код неоднозначен. сделать это ясно для второго элемента списка слов. Это
('playing test')
или('playing', 'test')
??