Если вы хотите удалить extea линии:
Для этой цели вы можете проверить состояние 2 для каждого, как один, если линия не следуют пустой новой линии, или строка должна предшествовать строке, соответствующей следующему регулярному выражению ^\d{2}:\d{2},\d{3}\s$
.
Таким образом, для доступа к следующей строке в каждой итерации вы можете создать один файловый объект из основного объекта файла с именем temp
с помощью itertools.tee
и применить функцию next
на нем. и используйте re.match
для соответствия регулярному выражению.
from itertools import tee
import re
with open('ex.txt') as f,open('new.txt','w') as out:
temp,f=tee(f)
next(temp)
try:
for line in f:
if next(temp) !='\n' or re.match(r'^\d{2}:\d{2},\d{3}\s$',pre):
out.write(line)
pre=line
except :
pass
результат:
1
17:02,111
Problem report related to
2
17:05,223
Restarting the systems
3
18:02,444
Must erase hard disk
Если вы хотите, чтобы сцепить отдыхать в третью строку:
И если вы хотите конкатенировать отдых линию после третьей линии третьей строки может использовать следующее regex, чтобы найти все блоки, которые следуют \n\n
или конец файла ($
):
r"(.*?)(?=\n\n|$)"
затем разделить ваши блоки на основе линии, которая в в формате даты и записи части в выходном файле, но обратите внимание, что вам нужно заменить новые линии в пределах 3-й части с пространством:
отл. ТХТ:
1
17:02,111
Problem report related to
router
another line
2
17:05,223
Restarting the systems
3
18:02,444
Must erase hard disk
now due to compromised data
line 5
line 6
line 7
Демо:
def splitter(s):
for x in re.finditer(r"(.*?)(?=\n\n|$)", s,re.DOTALL):
g=x.group(0)
if g:
yield g
import re
with open('ex.txt') as f,open('new.txt','w') as out:
for block in splitter(f.read()):
first,second,third= re.split(r'(\d{2}:\d{2},\d{3}\n)',block)
out.write(first+second+third.replace('\n',' '))
результат:
1
17:02,111
Problem report related to router another line
2
17:05,223
Restarting the systems
3
18:02,444
Must erase hard disk now due to compromised data line 5 line 6 line 7
Примечание:
В этом ответе функция splitter
возвращает генератор, который очень эффективен, когда вы имеете дело с большими файлами и отказаться от хранения неиспользуемых строк в памяти.
@aDoN Я обновил ответ с подходом, используя файл и в этом случае вам не нужно использовать '' cat' и pip'. – Kasramvd
исправьте меня, если я ошибаюсь, это не ваш выход неправильно, третьи строки удалены, но он хочет, чтобы он был добавлен ко второму праву. – The6thSense
@VigneshKalai. Да, спасибо, что напомнили, что, похоже, я пропустил это, или OP отредактировал вопрос! – Kasramvd