@invi86: Was heisst `re.sub()` wurde nicht „angenommen”? Das ist *die* Funktion zum ersetzen. Alles andere wäre bloss die Funktionalität von der Funktion umständlicher nachbasteln. Was wenig Sinn macht.
##### If you want to locate a match anywhere in string, use search() // deshalb verwende ich dieses #####
Du musst die Datei lesen. Die Daten verändern. Und dann die Datei mit den veränderten Daten neu speichern. Das sind drei Schritte und zweimal `open()` mit verschiedenen Modi. Man kann in einer Textdatei ”mitten drin” nichts verändern, man muss die immer komplett neu schreiben. (Stimmt nicht ganz, aber es ist einfacher und sicherer das so zu tun.)
##### ich soll aber leider keine neue datei erstellen lassen, sondern die vorhandene ändern mist #####
##### habe jetzt das erste open() im read modus und der zweite durchlauf mit write, er tut es jedoch aber überschreibt er immer noch alles.
Wobei reguläre Ausdrücke hier auch nur funktionieren wenn man ein paar Annahmen machen kann die von C++-Quelltext im allgemeinen nicht garantiert werden. Zum Beispiel kann man das erste und das zweite Argument nur erfassen wenn im ersten niemals Kommas vorkommen können, oder wenn die `COMPILE_TIME_ASSERT`\s nicht auf mehrere Zeilen umgebrochen vorkommen und danach kein weiterer Aufruf kommt der Kommas enthält. Kommentare oder Zeichenketten werden von dem regulären Ausdruck auch nicht berücksichtigt. Was Du da versuchst ist alles andere als robust.
###### es ist mehr zu übungszwecken gedacht, als robust zu sein hab keinen plan#######
Code: Alles auswählen
import re
with open("test.cpp", "r+") as f:
match = re.search("^(?P<Text1>.*)COMPILE_TIME_ASSERT\(\s*(?P<Text2>.+),(?P<Text3>\s*)(?P<Text4>\S*)(?P<Text5>\s*\)\s*;s*)","COMPILE_TIME_ASSERT(TABLE_LENGTH(PopupType2ActionID) == EPopupType::ARRAY_SIZE , PopupType2ActionID_table_needs_revision);")
result = '"' + match.group('Text4') + '"'
if match:
print("%sPCC_STATIC_ASSERT(%s,%s%s" % (match.group('Text1'), match.group('Text2'), result, match.group('Text5')))
f.write("%sPCC_STATIC_ASSERT(%s,%s%s" % (match.group('Text1'), match.group('Text2'), result, match.group('Text5')))
f.close()
Code: Alles auswählen
import re
with open("test.cpp", "w") as f:
match = re.search("^(?P<Text1>.*)COMPILE_TIME_ASSERT\(\s*(?P<Text2>.+),(?P<Text3>\s*)(?P<Text4>\S*)(?P<Text5>\s*\)\s*;s*)","COMPILE_TIME_ASSERT(TABLE_LENGTH(PopupType2ActionID) == EPopupType::ARRAY_SIZE , PopupType2ActionID_table_needs_revision);")
result = '"' + match.group('Text4') + '"'
if match:
print("%sPCC_STATIC_ASSERT(%s,%s%s" % (match.group('Text1'), match.group('Text2'), result, match.group('Text5')))
f.write("%sPCC_STATIC_ASSERT(%s,%s%s" % (match.group('Text1'), match.group('Text2'), result, match.group('Text5')))
f.close()