grep функциональность нескольких строк в Python - PullRequest
0 голосов
/ 26 декабря 2018

В сценарии unix присутствует следующий фрагмент кода:

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

Вышеприведенная команда выполняет поиск всех этих переменных из file.txt и основывается на результате записи «строки» в file1 elseнапишу 'строку' в 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

Как я могу получить ту же функциональность, что и в Unix в Python?

1 Ответ

0 голосов
/ 26 декабря 2018

Прежде всего, вы не перебираете свою file1.txt строку за строкой, поэтому я не знаю, откуда вы получаете eachline.Во-вторых, file1.read() эффективно читает все file1.txt при выполнении проверки (и в отличие от grep вы не делаете это построчно), поэтому любые последующие попытки его чтения будут возвращать пустой результат, в том числе если вы попытаетесьзаписать его содержимое в другой файл.Наконец, ваше регулярное выражение будет соответствовать любому, а не всем перечисленным значениям, как это делает цепочка / piped 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...