搜索字符串中的Python逻辑

时间:2011-02-27 07:23:16

标签: python logic

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)

5 个答案:

答案 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.pywhatsupdoc],并且您可能正在使用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)