2017-02-19 5 views
-1

Ich habe eine Protokolldatei, die ich bestimmte Teile löschen möchte. Im Folgenden wird ein Teil der Protokolldatei:Wie entferne ich eine Zeichenkette, die bestimmte Zeichenketten mit unterschiedlicher Länge innerhalb der Zeichenkette enthält?

I0216 10:18:04.720626 31559 solver.cpp:273] Solving 
I0216 10:18:04.720630 31559 solver.cpp:274] Learning Rate Policy: step 
I0216 10:18:05.242708 31559 solver.cpp:219] Iteration 0 (0 iter/s, 0.522037s/50 iters), loss = 1.60944 
I0216 10:18:05.242750 31559 solver.cpp:238]  Train net output #0: accuracy = 0 
I0216 10:18:05.242763 31559 solver.cpp:238]  Train net output #1: loss = 1.60944 (* 1 = 1.60944 loss) 
I0216 10:18:05.242785 31559 sgd_solver.cpp:105] Iteration 0, lr = 1e-10 
I0216 10:18:22.386440 31559 solver.cpp:219] Iteration 50 (2.91648 iter/s, 17.144s/50 iters), loss = 1.60944 
I0216 10:18:22.386497 31559 solver.cpp:238]  Train net output #0: accuracy = 0.643982 
I0216 10:18:22.386509 31559 solver.cpp:238]  Train net output #1: loss = 1.60944 (* 1 = 1.60944 loss) 
I0216 10:18:22.386515 31559 sgd_solver.cpp:105] Iteration 50, lr = 1e-10 
I0216 10:18:39.549926 31559 solver.cpp:219] Iteration 100 (2.91313 iter/s, 17.1637s/50 iters), loss = 1.60944 
I0216 10:18:39.550071 31559 solver.cpp:238]  Train net output #0: accuracy = 1 
I0216 10:18:39.550087 31559 solver.cpp:238]  Train net output #1: loss = 1.60944 (* 1 = 1.60944 loss) 
I0216 10:18:39.550093 31559 sgd_solver.cpp:105] Iteration 100, lr = 1e-10 
I0216 10:18:56.714752 31559 solver.cpp:219] Iteration 150 (2.91292 iter/s, 17.1649s/50 iters), loss = 1.60944 
I0216 10:18:56.714824 31559 solver.cpp:238]  Train net output #0: accuracy = 0.624222 
I0216 10:18:56.714838 31559 solver.cpp:238]  Train net output #1: loss = 1.60944 (* 1 = 1.60944 loss) 
I0216 10:18:56.714845 31559 sgd_solver.cpp:105] Iteration 150, lr = 1e-10 
I0216 10:19:13.893241 31559 solver.cpp:219] Iteration 200 (2.91059 iter/s, 17.1787s/50 iters), loss = 1.60944 
I0216 10:19:13.893450 31559 solver.cpp:238]  Train net output #0: accuracy = 1 
I0216 10:19:13.893467 31559 solver.cpp:238]  Train net output #1: loss = 1.60944 (* 1 = 1.60944 loss) 
I0216 10:19:13.893473 31559 sgd_solver.cpp:105] Iteration 200, lr = 1e-10 
I0216 10:19:31.094591 31559 solver.cpp:219] Iteration 250 (2.90674 iter/s, 17.2014s/50 iters), loss = 1.60944 
I0216 10:19:31.094650 31559 solver.cpp:238]  Train net output #0: accuracy = 0.61937 
I0216 10:19:31.094662 31559 solver.cpp:238]  Train net output #1: loss = 1.60944 (* 1 = 1.60944 loss) 
I0216 10:19:31.094667 31559 sgd_solver.cpp:105] Iteration 250, lr = 1e-10 
I0216 10:19:48.290045 31559 solver.cpp:219] Iteration 300 (2.90772 iter/s, 17.1956s/50 iters), loss = 1.60944 
I0216 10:19:48.290187 31559 solver.cpp:238]  Train net output #0: accuracy = 0.959229 
I0216 10:19:48.290205 31559 solver.cpp:238]  Train net output #1: loss = 1.60944 (* 1 = 1.60944 loss) 
I0216 10:19:48.290210 31559 sgd_solver.cpp:105] Iteration 300, lr = 1e-10 
I0216 10:20:05.504201 31559 solver.cpp:219] Iteration 350 (2.90457 iter/s, 17.2142s/50 iters), loss = 1.60944 
I0216 10:20:05.504257 31559 solver.cpp:238]  Train net output #0: accuracy = 0.772217 
I0216 10:20:05.504271 31559 solver.cpp:238]  Train net output #1: loss = 1.60944 (* 1 = 1.60944 loss) 

Wie es zu sehen ist, gibt es einige Linien, die mit 31559 solver.cpp:219] Iteration

ich anfangen möchte, ohne die anderen Zeilen der Datei zu ändern, um nur zu ändern diese Linien zum Beispiel dieses: FROM

... solver.cpp:219] Iteration 14750 (2.9004 iter/s, 17.239s/50 iters), loss = 1.60934 

Um

... solver.cpp:219] Iteration 14750, loss = 1.60934 
. 
. 
. 

Das bedeutet, ich möchte die Teilzeichenfolge (2.9004 iter/s, 17.239s/50 iters) aus den Zeilen entfernen, die die oben genannten Zeilen enthält, aber die anderen Zeilen bleiben unverändert. Danke

Ich möchte diese Teile in einer Zeile entfernen, die (2.8995 iter/s, 17.2444s/50 iters) enthalten, die Länge dieser Zeichenfolge kann voneinander abweichen. Dieser Teil beginnt mit ( und setzt sich mit einer Zahl (die von der anderen Leitung verschieden sein können und weiterhin mit iter/s, und wieder eine Nummer und endet mit iters)

AS @ delca85 das Muster vorgeschlagen, ist dies:.

p = "(\(\d*[.]?\d* iter/s\,\s\d*[.]?\d*)(s/[0-9]+)?(\siters\))" 

hat jemand einen Vorschlag? Vielen Dank im Voraus

Antwort

1

ich eine zusätzliche Annahme über den zweiten Teil Ihrer Zeichenfolge gemacht habe, dass es eine Zahl mit s/number ist. ich hoffe, dass ich nicht falsch bin zu sein, wie auch immer, in diesem Fall Bitte sag mir, ich würde mich freuen o finde eine andere Lösung für dich.

Das ist mein Vorschlag für Sie:

import re 

string = "I0216 11:42:50.047427 31559 solver.cpp:219] Iteration 14750 (2.9004 iter/s, 17.239s/50 iters), loss = 1.60934 I0216 11:42:50.047472 31559 solver.cpp:238]  Train net output \#0: accuracy = 1\" " 

p = "\(\d*[.]?\d* iter/s\, \d*[.]?\d*s/[0-9]+ iters\)" 
pattern = re.compile(p) 
for l in pattern.findall(string): 
    print l 

Ich hoffe, dass ich Ihnen helfen!

s/50 optional
Dies ist eine Lösung, die Sie bei s/50 ist optional im zweiten Teil Ihrer Zeichenfolge verwenden:

import re 

string = "I0216 11:42:50.047427 31559 solver.cpp:219] Iteration 14750 (2.9004 iter/s, 17.239s/50 iters), loss = 1.60934 I0216 11:42:50.047472 31559 solver.cpp:238]  Train net output \#0: accuracy = 1\" " 
string = string + "I0216 11:42:50.047427 31559 solver.cpp:219] Iteration 14750 (2.9004 iter/s, 17.239 iters), loss = 1.60934 I0216 11:42:50.047472 31559 solver.cpp:238]  Train net output \#0: accuracy = 1\" " 
p = "(\(\d*[.]?\d* iter/s\,\s\d*[.]?\d*)(s/[0-9]+)?(\siters\))" 
pattern = re.compile(p) 
for l in pattern.findall(string): 
    print ''.join(l) 

Datei öffnen, lesen Sie Linie, Übereinstimmungsmuster und ersetzen Zeile in der Datei

import re 

p = "(\(\d*[.]?\d* iter/s\,\s\d*[.]?\d*)(s/[0-9]+)?(\siters\))" 
pattern = re.compile(p) 
for line in fileinput.input("file.txt", inplace=1): 
    for m in pattern.findall(line): 
     string = ''.join(m) 
     if string in line: 
      line = line.replace(string, "") 
    sys.stdout.write(line) 
+0

Vielen Dank für Ihre Antwort, wie kann ich die Datei öffnen und finde 'p =" \ ([0-9 \.] + Iter/s \, [0-9 \.] + S/[0-9] + iters \) "' und entfernen Sie die Zeichenfolge aus der Datei. Sollte das Programm nicht die Zeilen lesen? Danke –

+0

@ S.EB Ich habe Zeile in der Datei ersetzen hinzugefügt. Ich hoffe, das könnte dir endlich helfen und du würdest meine Antwort annehmen und verbessern. – delca85

+0

Danke für Ihre Antwort. Leider funktioniert es nicht, da die "Zeichenfolge", die Sie hierher gebracht haben, in den Zeilen nicht gleich ist. die Iterationsnummern ändern sich ständig –

0

können Sie den regulären Ausdruck Modul verwenden fo r this ('re' genannt), mit dem Sie Sub-Strings schnell isolieren können. Hier

ist der Code:

import re 

file = open('your_file_with_correct_path') 
file_content = file.read() 

#The string you provided 
#No need to do the below string definition as you will use the file_content 
#str = ' I0216 11:42:50.047427 31559 solver.cpp:219] Iteration 14750 (2.9004 iter/s, 17.239s/50 iters), loss = 1.60934 I0216 11:42:50.047472 31559 solver.cpp:238] Train net output #0: accuracy = 1' 

sub_tring = re.findall('\(\d+.*\)', file_content) 

for element in sub_string: 
    #add element to the file you want 

#save the file where you added the elements 

sub_string eine Liste aller Teilzeichenketten sein, die dem Muster entsprechen, den Sie verlangen mit dem ersten Argument des findall Methode.

Ich empfehle, dass Sie sich die verschiedenen Sonderzeichen ansehen, die in regex verwendet werden, da dies wirklich nützlich für die Reinigung von Strings im Allgemeinen sein wird.

Danke.

+0

Danke für Ihre Antwort, diese 'str' ist nur eine Art der Zeilen in der Protokolldatei, Wie können wir das Programm ändern lesen Sie eine Zeile und bearbeiten Sie die Zeile, ob dies für enthält Beispiel '(2.9004 iter/s, 17.239s/50 iters)', falls ja, dann entferne diesen Teil aus der Zeile und speichere ihn. –

+0

Sie können Ihre gesamte Protokolldatei lesen, in Ihrem Fall wäre also str = log_file.read(). Dann können Sie die Variable sub_string erstellen, die ich im vorherigen Code hinzugefügt habe. Damit erhalten Sie eine Liste aller Muster, die in Ihrer Log-Datei übereinstimmen (dh Ihre (... iteren). Um sie zu speichern, müssen Sie einfach die Liste der Unterstrings durchlaufen und jedes Element zu dem gewünschten Dokument hinzufügen Speichern Sie das Dokument am Ende des Prozesses. – RobinW2

+0

@ S.EB Ich habe meine Antwort geändert, so dass Sie den gesamten Prozess hinter meinem vorherigen Kommentar sehen können. Dies sollte Ihnen helfen, zu bekommen, was Sie brauchen. – RobinW2

Verwandte Themen