在python中检查某些字符串的文本文件

时间:2015-12-04 00:25:05

标签: python string file search text

我正在研究python中的代码,它将查看数千个文本文件中的某些字符串,然后将这些文本文件的名称附加到两个列表中的一个。我正在尝试使用带有多个参数的if语句来执行此操作:

    # up here would be other code
    #
 with open("/home/textfile.txt", 'r') as f:
        textfile = f.read()
 if "this phrase" in textfile or "that phrase" in textfile and not "not this phrase" in textfile and not "not that phrase" in textfile:
    return True
 elif "not this phrase" in textfile or "not that phrase" in textfile:
    return False

现在在我的代码中,这些if语句中有更多参数,但出于某种原因,当我得到包含&#34的文本文件列表时,这个短语"或"该短语"其中一些还包含"而不是这个短语"。为什么会这样?是因为我在if语句中使用了太多的参数吗?该程序的主要目标是将文本文件名附加到一个或另一个列表,具体取决于TrueFalse是否返回到主函数。

2 个答案:

答案 0 :(得分:2)

您需要正确分组您的条件,例如:

if (
    ("this phrase" in textfile or "that phrase" in textfile) and not (
    "not this phrase" in textfile or "not that phrase" in textfile)
):
    return True

答案 1 :(得分:0)

同意尼克的回答。但是你说if语句中还有很多其他的参数,所以你不想在if循环中写下所有这些语句。

我建议使用两个列表。这是一些示例代码。

注意:请记住,这是一个快速而肮脏的解决方案。您可以通过使用生成器而不是列表来进行即兴创作(如果您的模式计数很高),可以根据您的喜好使用lambda函数来减少行数(虽然看起来很复杂)等。

contain_lst = ['pattern1', 'p2', 'p3']
not_contain_lst = ['ncp1', 'ncp2', 'ncp3', 'ncp4']
for each_file in files_list:
    with open(each_file) as f:
        data = f.read()
    contain_match = 1
    for each_contain_pattern in contain_lst:
        if each_contain_pattern in data:
            contain_match = 0
    not_contain_match = 0
    for each_not_contain_pattern in not_contain_lst:
        if each_not_contain_pattern in data:
            not_contain_match = 1
    if contain_match and not not_contain_match:
        print "File %s has all the needed patterns and doesn't have the not needed patterns" % each_file
    else:
        print "ERROR- File %s doesn't match the requirements" % each_file