Si vous ouvrez un interpréteur python, vous constaterez que "doc" and "pdf" and "xls" and "jpg"
est la même chose que 'jpg'
:
>>> "doc" and "pdf" and "xls" and "jpg"
'jpg'
Ainsi, au lieu de tester toutes les chaînes de caractères, votre première tentative ne teste que "jpg".
Il y a plusieurs façons de faire ce que vous voulez. La méthode ci-dessous n'est pas la plus évidente, mais elle est utile :
if not any(test_string in text for test_string in ["doc", "pdf", "xls", "jpg"]):
filtered.append(text)
Une autre approche consisterait à utiliser un for
en conjonction avec une boucle else
déclaration :
for test_string in ["doc", "pdf", "xls", "jpg"]:
if test_string in text:
break
else:
filtered.append(text)
Enfin, vous pouvez utiliser une compréhension de liste pure :
tofilter = ["one.pdf", "two.txt", "three.jpg", "four.png"]
test_strings = ["doc", "pdf", "xls", "jpg"]
filtered = [s for s in tofilter if not any(t in s for t in test_strings)]
EDITAR :
Si vous souhaitez filtrer à la fois les mots et les extensions, je vous recommande ce qui suit :
text_list = generate_text_list() # or whatever you do to get a text sequence
extensions = ['.doc', '.pdf', '.xls', '.jpg']
words = ['some', 'words', 'to', 'filter']
text_list = [text for text in text_list if not text.endswith(tuple(extensions))]
text_list = [text for text in text_list if not any(word in text for word in words)]
Cela peut encore conduire à certaines inadéquations ; le filtre ci-dessus filtre également "Faites quelque chose", "C'est un orfèvre", etc. Si cela pose un problème, vous aurez peut-être besoin d'une solution plus complexe.