2014-01-31 3 views
0

У меня есть большой файл журнала. Я хочу извлечь строки, содержащие java/javax/or/com, а затем ./:. Для каждой строки, подобной этой, я хочу извлечь некоторые из соответствующих строк, которые являются стеками стека, и начинается с at. Например:Python копирование файлов с использованием regex

Line1: java.line.something.somethingexception 
line 2: at something something 
line 3: at something something 
line 4: at something something 

line 5-20:Junk I don't want to extract. 
line 21: javax.line.something.somethingexception 
line 22: at something something 
line 23: at something something 
line 24: at something something 

и так далее ...

Здесь я хочу линии 1-4, а затем снова линии 21-24 копирования. Пока мой код собирает строку, содержащую ключевые слова, но я не могу понять, как написать конкретное количество строк после этого, пропустить несколько строк и начать писать снова. Эти строки, которые начинаются с, являются случайными, т.е. они может быть 100 строк, или они могут быть 250 строк, поэтому нет шаблона.

Вот мой код:

import re 
import sys 
from itertools import islice 

file = open(sys.argv[1], "r") 
file1 = open(sys.argv[2],"w") 
i = 0 
for line in file: 
    if re.search(r'[java|javax|org|com]+?[\.|:]+?', line, re.I) and not (re.search(r'at\s', line, re.I) or re.search(r'mdcloginid:|webcontainer|c\.h\.i\.h\.p\.u\.e|threadPoolTaskExecutor|caused\sby', line, re.I)): 
      file1.write(line) 

Этот код только извлекает строки, содержащие ключевые слова, но я застрял на том, как сделать следующую часть, т.е. скопировать следующие строки, содержащие в и записать их в новый файл, остановка, где «at» заканчивается. Найдите следующую строку с ключевыми словами и повторите одно и то же действие.

ответ

1

Это может быть решена с помощью флага, установленного в случае, если они соответствовали вашим конкретным условиям:

java_regex = re.compile(...) # java 
at_regex = re.compile(...) # at 

copy = False # flag that control to copy or to not copy to output 

for line in file_in: 
    if re.search(java_regex, line): 
     # start copying if "java" is in the input 
     copy = True 
    else: 
     if copy and not re.search(at_regex, line): 
      # stop copying if "at" is not in the input 
      copy = False 

    if copy: 
     file_out.write(line) 
1

Установите флажок, чтобы указать, если линии вы обработки в блоке исключений или нет:

import re 
import sys 
from itertools import islice 

file = open(sys.argv[1], "r") 
file1 = open(sys.argv[2],"w") 
i = 0 
ex = False 
for line in file: 
    if re.search(r'[java|javax|org|com]+?[\.|:]+?', line, re.I) and not (re.search(r'at\s', line, re.I) or re.search(r'mdcloginid:|webcontainer|c\.h\.i\.h\.p\.u\.e|threadPoolTaskExecutor|caused\sby', line, re.I)): 
      file1.write(line) 
      ex = True 
    elif ex: 
      if line.startswith('at'): 
       file1.write(line) 
      else: 
       ex = False 
Смежные вопросы