2017-12-21 8 views
0

Diese Frage wurde möglicherweise schon einmal gestellt, aber diese passt nicht zu meiner Situation. Ich habe die meisten schon durchgespielt, aber keine der Lösungen hilft.Extrahieren Sie bestimmte Zeilen zwischen der Variablen no von. Zeilen aus der Textdatei in Python

Also, hier ist das Problem. Ich habe eine Textdatei mit einer großen Anzahl von Zeilen.
Hier ist ein Beispiel der Datei:

yyyyyy=xxxx 
yyyyyy=xxxxxxxx 

Sun Oct 22 15:19:23 PDT 2017 
calling sequenc node 

++ entering node aaa (  ) 
Sun Oct 22 15:19:23 PDT 2017 
lines xxxxxxxx 
calling wroot.bat 

++ entering node bbb (xxx  ) 
Sun Oct 22 15:19:23 PDT 2017 
xxxxxxxxxxxxxx 
calling bsod.bat 
xaaaaa 
bbbbb 
tttttt 
bbb completed successfully 
-- exiting node bbb 

++ entering node ccc (yyyy  ) 
Sun Oct 22 15:19:35 PDT 2017 
xxxxxxxxxxxxxxxxx 
calling wpretest.bat 

Nun möchte ich die Zeilen von dem rufenden Teil extrahieren (im Lieferumfang enthalten) an den Linien, die erfolgreich Zeile über der abgeschlossen ist. Außerdem möchte ich die Zeile nur extrahieren, wenn sie einen Anfang mit ++ hat. Das Nein von. Zeilen nach dem Anruf variiert. Es kann ein Leerzeichen haben, 2 oder mehr Zeilen folgen. Wenn keine Zeile folgt, möchte ich nur die Anrufzeile extrahieren. Wenn in der nächsten Zeile erfolgreich abgeschlossen wird, möchte ich auch die einzelne Anrufzeile extrahieren. Und wenn es andere Zeilen zwischen der aufrufenden Zeile gibt und erfolgreich abgeschlossen wurde, möchte ich alle extrahieren.

Hier ist der Code Ich habe auch mit regulären Ausdrücken versucht zusammen (die Arbeit offenbar nicht)

with open('myfile.txt','r') as log: 
    for line in log: 

     match = re.search(node_name_pattern, line) 
     if line.startswith('++') and match:   
      node_name.append(match.group()) 
      nn=match.group() 
     match2 = re.search(node_parameter, line) 
     if line.startswith('++') and match2: 
      parameter.append(match2.group()) 
      start_time.append(log.next().strip()) 
      features.append(log.next().strip()) 
     if "calling" in line : 
       content.append(line.strip()) 

Hier ist die erwartete Ausgabe:

calling wroot.bat 
calling bsod.bat, 
xaaaaa, 
bbbbb, 
tttttt 
calling wpretest.bat 
+1

Bitte fügen Sie den Code, den Sie versucht haben und Beispieltext –

+0

Wo ist Ihre Probe? Könnten Sie uns ein detailliertes Beispiel mit Eingabe und erwarteter Ausgabe geben? – Allan

+0

Entschuldigung. Habe gerade meine Frage bearbeitet. –

Antwort

1

Wenn Sie eine regex dies wünschen funktionieren sollte:

r'(?<=\n)calling.*?(?=\n[^\n]*completed succ[^\n]*\n|\n\+\+|\s*\Z)' 

in Resultierende:

>>> bla = open('bla').read() 
>>> re.findall(r'(?<=\n)calling.*?(?=\n[^\n]*completed succ[^\n]*\n|\n\+\+|\s*\Z)',bla,re.DOTALL) 
['calling sequenc node\n', 'calling wroot.bat \n', 'calling bsod.bat \nxaaaaa\nbbbbb\ntttttt', 'calling wpretest.bat'] 

Aufbrechen der regex

So kann man mit ihm spielen, um:

  1. (?<=\n)calling - suchen Sie nach dem Wort "Berufung", wenn er sofort eine neue Zeile folgt.
  2. .* Weiter zur nicht-gierig alles akzeptiert
  3. bis (?=...|...|...) einem der Hit (| Mittel oder):

    ein. \n[^\n]*completed succ[^\n]*\n Eine Zeile mit "vervollständigtem Succ". Dies ist im Wesentlichen ein Zeilenumbruch, so viele Nicht-Zeilenumbruch-Zeichen, wie Sie wollen, bis "vervollständigter Erfolg", mehr Zeichen und schließlich eine neue Zeile. Das könnte wohl im completed succ Teil enden, da es mir egal ist, den Rest dieser Zeile zu finden, jetzt wo ich darüber nachdenke.

    b. \n\+\+ ein Zeilenumbruch, der mit "++" beginnt.

    c. \s*\Z Beliebige Leerzeichen (\ n, "", \ t usw.) bis zum Ende der gesamten Zeichenfolge \Z.

würde ich halte nur eine Schleife verwenden, so etwas wie:

res = [] 
inside = False 
with open('bla') as bla: 
    for line in bla: 
     if inside: 
      if line.startswith('++') or "completed successfully" in line: 
       inside = False 
      else: 
       res[-1].append(line)    
     elif line.startswith("calling"): 
      res.append([line]) 
      inside = True 

Vielleicht inside==False überprüfen Fehler, wenn die Zeile mit calling beginnt, nur für den Fall.

+0

Versuchte es aber nicht helfen. Es gibt mir nur die Zeilen wo es 2 durchgehende Anrufzeilen gibt. –

+0

@ImdadulChoudhury Ich vermisste Sie möchten Anrufe in der letzten Zeile sowie in Ihren erwarteten Ausgaben übereinstimmen - behoben. Ich bin mir noch nicht sicher, was du mit zwei kontinuierlichen Aufrufen meinst, aber jetzt stimmt die erwartete Ausgabe mit dem überein, was ich habe. – kabanus

+0

Kontinuierlich bedeutete ich, dass die Ausgabe mir die Zeilen gibt, wo es 2 Zeilen gibt, die mit dem "Anrufen" beginnen. –

Verwandte Themen