filtered=[]
text="any.pdf"
if "doc" and "pdf" and "xls" and "jpg" not in text:
filtered.append(text)
print(filtered)
这是我在Stack Overflow中的第一篇文章,所以如果在Question中有一些令人讨厌的东西,那么如果文本不包含任何这些单词,则代码会假设附加文本:doc,pdf,xls,jpg。 如果像它那样工作正常:
if "doc" in text:
elif "jpg" in text:
elif "pdf" in text:
elif "xls" in text:
else:
filtered.append(text)
答案 0 :(得分:6)
如果你打开一个python解释器,你会发现"doc" and "pdf" and "xls" and "jpg"
与'jpg'
是一样的:
>>> "doc" and "pdf" and "xls" and "jpg"
'jpg'
因此,不是对所有字符串进行测试,而是首次尝试仅针对“jpg”进行测试。
有很多方法可以做你想要的。以下不是最明显的,但它很有用:
if not any(test_string in text for test_string in ["doc", "pdf", "xls", "jpg"]):
filtered.append(text)
另一种方法是将for
循环与else
语句结合使用:
for test_string in ["doc", "pdf", "xls", "jpg"]:
if test_string in text:
break
else:
filtered.append(text)
最后,你可以使用纯列表理解:
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)]
修改强>:
如果你想过滤单词和扩展名,我建议如下:
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)]
这仍可能导致一些不匹配;上面还过滤了“做某事”,“他是一个文字匠”等等。如果这是一个问题,那么你可能需要一个更复杂的解决方案。
答案 1 :(得分:4)
如果这些扩展始终在最后,您可以使用.endswith
来解析元组。
if not text.endswith(("doc", "pdf", "xls", "jpg")):
filtered.append(text)
答案 2 :(得分:3)
basename, ext = os.path.splitext(some_filename)
if not ext in ('.pdf', '.png'):
filtered.append(some_filename)
....
答案 3 :(得分:1)
尝试以下方法:
if all(substring not in text for substring in ['doc', 'pdf', 'xls', 'jpg']):
filtered.append(text)
答案 4 :(得分:1)
当前选择的答案非常好,只要解释完成想要要做的事情的语法正确方法。但是很明显,您正在处理文件扩展名,该文件扩展名出现在结束 [失败:doctor_no.py
,whatsupdoc
],并且您可能正在使用Windows,其中大小写区别于在文件路径中不存在[失败:FUBAR.DOC
]。
覆盖这些基础:
# setup
import os.path
interesting_extensions = set("." + x for x in "doc pdf xls jpg".split())
# each time around
basename, ext = os.path.splitext(text)
if ext.lower() not in interesting_extensions:
filtered.append(text)