Wie man das richtige Regex-Format zum Suchen und Ersetzen von Zeilen in einer Datei schreibt

Ich habe zwei Dateien, und beide sehen aus wie sie sind (Ausgenommen die Daten nach K in jeder Zeile beginnend nur mit PBUSH in beiden Dateien):

$ Elements and Element Properties for region : RFAST_BUSH_CID_1.a.r1.r1. $ .r1 PBUSH 9 K 435008. 522649. 6.8198+6 8.1938+6 RCV 1. 1. 1. 1. $ Pset: "RFAST_BUSH_CID_1.a.r1.r1..r1" will be imported as: "pbush.9" CBUSH 1207216 9 1014816 100670 1 .5 $ Elements and Element Properties for region : RFAST_BUSH_CID_1.b.r1.r1. $ .r1 PBUSH 10 K 319265. 148977. 988690. 461348. RCV 1. 1. 1. 1. $ Pset: "RFAST_BUSH_CID_1.b.r1.r1..r1" will be imported as: "pbush.10" CBUSH 1207615 10 1016116 800007 1 .5 $ Elements and Element Properties for region : RFAST_BUSH_CID_12.r1.r1.r PBUSH 11 K 311773. 341027. 2.4204+6 2.6475+6 RCV 1. 1. 1. 1. $ Pset: "RFAST_BUSH_CID_12.r1.r1.r" will be imported as: "pbush.11" CBUSH 1208216 11 1017412 100781 0 .5 $ Elements and Element Properties for region : pbush.6284.r1.r1.r1.r1.r1 PBUSH 6284 K 496800. 496799. 9.6155+6 9.6154+6 RCV 1. 1. 1. 1. $ Pset: "pbush.6284.r1.r1.r1.r1.r1" will be imported as: "pbush.6284" CBUSH 1206132 6284 1012231 101532 1 .5 $ Elements and Element Properties for region : pbush.6286.r1.r1.r1.r1.r1 PBUSH 6286 K 496800. 496799. 9.6155+6 9.6154+6 RCV 1. 1. 1. 1. 

Angenommen, das ist meine Quelldatei, von der ich nach allen Zeilen, die mit PBUSH beginnen, gesucht wird (die gleich bleibt), gefolgt von Leerzeichen, gefolgt von Nummer (die sich wie im Bild gezeigt ändert) und überprüft, ob es ist In der Zieldatei basierend auf Keyword, "PBUSH Number". Wenn sie in der Zieldatei gefunden werden, müssen die Daten nach "K" von der Quell- zur Zieldatei an der exakten Zeile ausgetauscht werden, wo sie gefunden wird. Also muss es durch alle Zeilen in Quell- und Zieldatei bis zum Ende iterieren. Jetzt habe ich etwas mit dem folgenden Code zu arbeiten:

  • Verwendung von "global" Schlüsselwort in Python
  • Django strip_tags Vorlagenfilter Platz hinzufügen
  • Wie bekomme ich Unit-Test-Ergebnisse in Eclipse + Pydev?
  • Wie kann ich Echtzeit-Chat-Nachrichten in der Datenbank speichern?
  • Wie man sowohl Live-Video-Frame und Zeitstempel von ffmpeg zu python auf Windows zu holen
  • In Numpy, wie man zwei 2-D-Arrays zippt?
  •  import re path1 = "C:\Users\sony\Desktop\PBUSH1.BDF" path2 = "C:\Users\sony\Desktop\PBUSH2.BDF" with open(path1) as f1, open(path2) as f2: dat1 = f1.read() dat2 = f2.read() matches = re.findall('^PBUSH\s+[0-9]\s+[0-9 ]+', dat1, flags=re.MULTILINE) for match in matches: dat2 = re.sub('^{}\s+[0-9]\s+'.format(match.split(' ')[0]), match, dat2, flags=re.MULTILINE) with open(path2, 'w') as f: f.write(dat2) 

    Ich habe Schwierigkeiten, die genaue Ausgabe zu bekommen, was ich suche. Mein Format bei findall und sub scheint falsch Muss ich etwas für Dezimalstellen verwenden? Im Moment wird in der Zieldatei nichts geändert. Ich bin ständig variieren die Formate zu überprüfen, was hier passt ..

  • Melden Sie alle Anfragen an Datei Django
  • Pandas DataFrames im Reportlab
  • Was ist der Unterschied zwischen pandas.qcut und pandas.cut?
  • Auspacken eines 1-Tupels in einer Liste der Länge 1
  • Zeitstempel außerhalb der Reichweite für Plattform localtime () / gmtime () Funktion
  • Wie kann ich ein Datumsobjekt in einem anderen Ort verfassen?
  • One Solution collect form web for “Wie man das richtige Regex-Format zum Suchen und Ersetzen von Zeilen in einer Datei schreibt”

    Im Allgemeinen würde man die BDF-Dateien mit etwas wie dem pyNastran analysieren und schreiben.


    Doch in diesem speziellen Fall mit deinem Ansatz ist das nicht falsch; Obwohl deine regulären Ausdrücke falsch sind, obwohl das Prinzip hier funktioniert. Beachten Sie auch, Sie müssen rohe Strings oder Flucht \ in den Pfaden verwenden; Die Verwendung von unescaped \ wird veraltet und kann zu schwer zu findenden Fehlern führen.

     import re # must use raw strings for paths, otherwise we need to # escape \ characters input1 = r"C:\Users\sony\Desktop\PBUSH1.BDF" input2 = r"C:\Users\sony\Desktop\PBUSH2.BDF" output = r"C:\Users\sony\Desktop\OUTPUT.BDF" with open(path1) as f1, open(path2) as f2: dat1 = f1.read() dat2 = f2.read() # use finditer instead of findall so that we will get # a match object for each match. # # For each matching line we also have one subgroup, containing the # "PBUSH NNN " part, whereas the whole regex matches until # the next end of line matches = re.finditer('^(PBUSH\s+[0-9]+\s+).*$', dat1, flags=re.MULTILINE) for match in matches: # for each match we construct a regex that looks like # "^PBUSH 123 .*$", then replace all matches thereof # with the contents of the whole line dat2 = re.sub('^{}.*$'.format(match.group(1)), match.group(0), dat2, flags=re.MULTILINE) with open(output) as outf: outf.write(dat2) 
    Python ist die beste Programmiersprache der Welt.