grep python中的多字符串功能

时间:2018-12-26 19:08:12

标签: python grep

在unix脚本中,存在以下代码:

grep -E 'value1' file1.txt | grep 'value2' | grep 'value3' | grep 'value3'

上面的命令将grepping file.txt中的所有变量,并根据结果在file1中写入“行”,否则将在file2中写入“行”

我想在Python中复制相同的功能。

我用变量的值创建了一个数组:

regexarr = ['value1', 'value2', 'value3', 'value4']

然后我以以下方式打开文件:

with open('file1.txt', 'r') as file1:
    # then I have the below code to match the strings in the regexarr
    if any(re.findall('|'.join(regexarr), file1.read())):               
        with open ('file2.txt', 'a+') as file2:
            file2.write(eachline)
    else:
        with open('file3.txt', 'a+') as file3:
            file3.write(eachline)

使用上面的代码,即使我有要写入到file3.txt的测试数据,也不会写入file3.txt

如何获得与python中的unix相同的功能?

1 个答案:

答案 0 :(得分:1)

首先,您没有逐行遍历file1.txt,所以我不知道您从哪里得到eachline。其次,file1.read()在检查时有效地读取了整个file1.txt(与grep不同的是,您不是逐行进行读取),因此任何后续的读取尝试都会返回一个空结果,包括如果您尝试将其内容写入另一个文件。最后,您的正则表达式将匹配链表/管道grep中的任何值,而不是所有列出的值(第一个grep过滤value1上的行,第二个过滤器value2上的行先前已过滤的行等)。

因此,请修复所有问题,这是模拟grep的一种方法:

regexarr = ['value1', 'value2', 'value3']

with open('file1.txt', 'r') as f1, \
        open('file2.txt', 'a+') as f2, \  # open file2.txt and file3.txt immediately
        open('file3.txt', 'a+') as f3:
    for line in f1:  # iterate over file1.txt contents line by line
        if all(re.search(r, line) for r in regexarr):
            f2.write(line)  # write only the matching lines to file2.txt
        else:
            f3.write(line)  # write non-matching lines to file3.txt