2015-06-19 3 views
4

Допустим, у меня есть этот файл:Python. Регистрация конкретных линий на 1 линии

1 
17:02,111 
Problem report related to 
router 

2 
17:05,223 
Restarting the systems 

3 
18:02,444 
Must erase hard disk 
now due to compromised data 

Я хочу этот вывод:

1 
17:02,111 
Problem report related to router 

2 
17:05,223 
Restarting the systems 

3 
18:02,444 
Must erase hard disk now due to compromised data 

пытался в Баш и получил своего рода близко решение, но я не» я знаю, как это осуществить на Python.

Спасибо заранее

ответ

4

Если вы хотите удалить 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 возвращает генератор, который очень эффективен, когда вы имеете дело с большими файлами и отказаться от хранения неиспользуемых строк в памяти.

+0

@aDoN Я обновил ответ с подходом, используя файл и в этом случае вам не нужно использовать '' cat' и pip'. – Kasramvd

+0

исправьте меня, если я ошибаюсь, это не ваш выход неправильно, третьи строки удалены, но он хочет, чтобы он был добавлен ко второму праву. – The6thSense

+1

@VigneshKalai. Да, спасибо, что напомнили, что, похоже, я пропустил это, или OP отредактировал вопрос! – Kasramvd

1
x="""1 
17:02,111 
Problem report related to 
router 

2 
17:05,223 
Restarting the systems 

3 
18:02,444 
Must erase hard disk 
now due to compromised data 
or something""" 
def repl(matchobj): 
    ll=matchobj.group().split("\n") 
    return "\n".join(ll[:3])+" "+" ".join(ll[3:]) 
print re.sub(r"\b\d+\n\d+:\d+,\d+\b[\s\S]*?(?=\n{2}|$)",repl,x) 

Вы можете использовать re.sub с вашей собственной функцией замены.

3

Это хорошо работает, если и только если файл в соответствии с вашими данного образца

Примечание:

There may be a faster way if regex is used and it might also be simpler но хотел сделать это в логическом порядке

Код:

inp=open("output.txt","r") 
inp=inp.read().split("\n") 
print inp 
tempString="" 
output=[] 
w=0 

for s in inp: 
    if s: 
     if any(c.isalpha() for c in s): 
      tempString=tempString+" "+s 
     else: 
      w=0 
      if tempString: 
       output.append(tempString.strip()) 
       tempString="" 
      output.append(s)  

    else: 
     if tempString: 
      output.append(tempString.strip()) 
      tempString="" 
     output.append(" ") 
if tempString: 
    output.append(tempString.strip()) 


print "\n".join(output) 
out=open("newoutput.txt","w") 
out.write("\n".join(output)) 
out.close() 

Ввод:

1 
17:02,111 
Problem report related to 
2 router 

2 
17:05,223 
Restarting the systems 

3 
18:02,444 
Must erase hard disk 
now due to compromised data 

4 
17:02,111 
Problem report related to 
router 

выход:

1 
17:02,111 
Problem report related to 2 router 

2 
17:05,223 
Restarting the systems 

3 
18:02,444 
Must erase hard disk now due to compromised data 

4 
17:02,111 
Problem report related to router 
+0

Удивительное решение, любая идея, если текст: Prob lem, относящийся к 2 маршрутизаторам, и «2» - начало новой линии? – aDoN

+0

, так что вы говорите, что строка может содержать 2 маршрутизатора справа – The6thSense

+0

отредактировал @aDoN надеюсь, что это поможет – The6thSense

 Смежные вопросы

  • Нет связанных вопросов^_^