Удалить определенные строки и определенную пустую строку в Python - PullRequest
2 голосов
/ 23 мая 2019

Я удаляю конкретную строку и пустую строку в текстовом файле, и это следует из моего предыдущего вопроса ... Я ссылаюсь на некоторые примеры и решения наших экспертов SO ... и это работает хорошо, удаляя строку, но не пустая строка. Чтобы было проще понять, я выделю здесь проблему.

Некоторая часть текстового файла содержит строку из строк A, stringB и stringC, а также пустую строку под ним и только для удаления одной строки под ним.

line0
line1      stringAxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line2                stringBxxxxxxxxxxxxxxxxxxxxxxx
line3        stringCxxxxxxxxxxxxxxxxxxx 
line4
line5
line6  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line7  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line8  
line9  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line10 textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line11               stringBxxxxxxxxxxxxxxxxxxxxxxx
line12       stringCxxxxxxxxxxxxxxxxxxx  
line13
line14
line15  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line16  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line17 
line18  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line19  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line20
line21  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line22  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line23 
line24  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line25  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line26               stringBxxxxxxxxxxxxxxxxxxxxxxx
line27       stringCxxxxxxxxxxxxxxxxxxx  
line28
line29
line30  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line31  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line32  

В этом случае удаляется любая строка, в которой есть любая строка A, stringB, stringC и одна строка после нее. Например, выше удалить строку 1,2,3,4 удалить строку 11,12,13 удалить строку 26,27,28

Я пытался использовать strip (), но он удаляет всю пустую строку. Это скрипт, который я использую, и он удаляет все строки, содержащие строки A, stringB и stringC.

filename = 'raw.txt'
with open(filename, 'r') as fin:
    lines = fin.readlines()
with open('clean.txt', 'w') as fout:
   for line in lines:
        if not re.match(r"\s+(stringA|stringB|stringC)", line):
            fout.write(line)

ожидаемый результат

line0
line5
line6  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line7  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line8  
line9  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line10 textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line14
line15  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line16  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line17 
line18  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line19  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line20
line21  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line22  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line23 
line24  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line25  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line29
line30  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line31  textxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
line32  

Благодарим Вас за помощь и любезную помощь. Спасибо.

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Оптимизированное решение:

with open('raw.txt', 'r') as fin, open('clean.txt', 'w') as fout:
    string_c_pat = re.compile(r'\s+stringC')
    pat = re.compile(r"\s+(stringA|stringB|stringC)")

    for line in fin:    # traversing file as iterator 
        if string_c_pat.match(line):
            next(fin)   # skip `stringC` line and jump to next line
        if not pat.match(line):
            fout.write(line)

с использованием re.compile() и сохранение полученного регулярного выражения Объект для повторного использования более эффективен, когда будет использоваться выражение несколько раз в одной программе.

1 голос
/ 23 мая 2019

Я почти уверен, что это не самый лучший ответ, но метод, похожий на флаг, работает:

import re
filename = 'raw.txt'
with open(filename, 'r') as fin:
    lines = fin.readlines()

flag = 0

with open('clean.txt', 'w') as fout:
    for line in lines:
        if not re.match(r'.*(stringA|stringB|stringC)', line):
            if not flag:
                fout.write(line)
            flag = 0
        else:
            flag = 1

Надеюсь, это помогло

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...