Seite 1 von 1
Text zwischen zwei Zeichen aus Datei suchen und ersetzen
Verfasst: Mittwoch 8. März 2017, 15:48
von wbach
Hallo Zusammen,
ich suche ein Lösung für mein Problem. Mein Programm soll Texte aus Dateien finden und ersetzen. Aber nun suche ich nach zwei Zeichen und einem Text der nicht verändert werden darf.
Bsp.: LOG(X) wird ersetzt durch (LN(X)/LN(10))
Dabei kann X sowohl eine Zahl sein als auch eine Variable
Wichtig ist, dass das X nicht verändert wird. Bisher habe ich das so gemacht
Code: Alles auswählen
def mirationStart():
#Step 1: Replace "Space" to ""
searchSpace = "'$> $<'"
replaceSpace = " "
for line in fileinput.input(pathOutput, inplace=1):
line = line.replace(searchSpace, replaceSpace)
sys.stdout.write(line)
Bei diesem suchen und ersetzen ist es egal was was im gesuchten/ersetzten Text stehet.
Weiß jemand hierzu eine Lösung?
LG wbach
Re: Text zwischen zwei Zeichen aus Datei suchen und ersetzen
Verfasst: Mittwoch 8. März 2017, 15:53
von BlackJack
@wbach: Klingt nach regulären Ausdrücken, also dem `re`-Modul in Python.
Edit: Wobei X dann nicht selbst ein geklammerter Ausdruck sein darf, denn dann kommt man mit regulären Ausdrücken nicht mehr weiter, da bräuchte man dann einen Parser für die (mathematischen) Ausdrücke.
Re: Text zwischen zwei Zeichen aus Datei suchen und ersetzen
Verfasst: Mittwoch 8. März 2017, 15:59
von wbach
Hi BlackJack,
mit re.search habe ich ebenfalls schon rumgespielt. Das würde aber nur funktionieren bei einem Ergebnis. Ich werde aber unbestimmte Anzahl an Ergebnissen haben.
Zudem bin ich im Ingenieur und kein Programmierer. Meine Programmierkenntnisse sind nicht auf dem höchsten Stand
LG
Re: Text zwischen zwei Zeichen aus Datei suchen und ersetzen
Verfasst: Mittwoch 8. März 2017, 16:19
von BlackJack
@wbach: `re.search()` ist zum Suchen, wie der Name verrät, Du willst ja ersetzen.
Was Du mit dem letzten Satz sagen möchtest ist mir nicht so ganz klar. Reguläre Ausdrücke sind eine eigene Sprache und nicht ganz unkompliziert. Aber in fast jeder Programmiersprache und jedem brauchbaren Texteditor als Werkzeug verwendbar. Da sollte man sich, wenn man Text verarbeiten will, also mal mit auseinander setzen. In der Python-Dokumentation gibt es neben der Dokumentation zum Modul noch ein How-To. Und ansonsten gibt es auch Bücher und Material zu regulären Ausdrücken die unabhängig von der Programmiersprache sind. Werkzeuge die einem konkrete reguläre Ausdrücke erklären und auf eingegebene Beispieldaten anwenden sind beim entwickeln auch ganz praktisch. Die gibt's sowohl als Desktopanwendungen als auch im Netz. Beispiel:
https://www.regex101.com/
Re: Text zwischen zwei Zeichen aus Datei suchen und ersetzen
Verfasst: Mittwoch 8. März 2017, 17:36
von Sirius3
@wbach: einfacher wäre es "LOG(" durch "1/LN(10)*LN(" zu ersetzen, solange der LOG-Ausdruck nicht noch potenziert wird, aber dann hast Du bei Deiner anderen Art zu ersetzen genauso Probleme.
Re: Text zwischen zwei Zeichen aus Datei suchen und ersetzen
Verfasst: Mittwoch 8. März 2017, 17:47
von wbach
Hallo Sirius3,
das ist eine gute Idee aber später benötige ich das selbe Prinzip nochmal für den Schritt:
Ersetze "PIBX" durch "PEEK_BYTE(AREA:=16#81,DBNUMBER:=0,BYTEOFFSET:=X)"
Ich komme nicht drum herum.
Zudem muss hinter X dann noch eine weitere Klammer.
LG
Re: Text zwischen zwei Zeichen aus Datei suchen und ersetzen
Verfasst: Samstag 18. März 2017, 08:30
von wbach
Hallo Zusammen,
ich meine Problematik gelöst.
Code: Alles auswählen
shutil.copy(pathInput, pathOutput)
for line in fileinput.input(pathOutput, inplace=1):
# Step 1: Replace "Space" to ""
line = line.replace("$> $<", " ")
# Step 2: Replace "EXPD(" to "10**("
line = line.replace("EXPD(", "10**(")
sys.stdout.write(line)
# Step 3: Replace "LOG(" to "10**("
#Sollte eine Abfrage in der Datei starten, die die ganze Datei nochmal durchsucht
g = open(pathInput)
lineg = g.readlines()
global foundWord
stratLogSearch = 0
for iFor in lineg:
searchWord = lineg[stratLogSearch].find("LOG(")
if searchWord != -1:
lastRow = len(lineg[stratLogSearch])
lastComment = lineg[stratLogSearch].find("//")
if lastComment != -1:
lastSine = lastComment
else:
lastSine = lastRow
notRepWord = lineg[stratLogSearch][searchWord + 4:lastSine]
z = 1
y = len(notRepWord)
int(y)
w = 0
for iSearch in xrange(0, y):
w = w + 1
start = notRepWord[iSearch:iSearch + 1]
if start == "(":
z = z + 1
elif start == ")":
z = z - 1
if z == 0:
foundWord = notRepWord[:w - 1]
shutil.copy(pathInput, pathOutput)
for line in fileinput.input(pathOutput, inplace=1):
line = line.replace("LOG(" + foundWord + ")", "LN(" + foundWord + "/LN(10))")
sys.stdout.write(line)
break
stratLogSearch = stratLogSearch + 1
Aber einer Sache ist mir noch unklar. Die Funktion ersetzt nicht alle Beispiele.
Bsp.:
[codebox=text file=Unbenannt.txt]FUNCTION Ausnahme_Test: VOID
VAR_TEMP
myBool: BOOL;
x: STRING;
myByte: BYTE;
myReal: REAL;
END_VAR
BEGIN
myBool:=ENO;
x:='Test Test';
myByte:=PEEK_BYTE(AREA:=16#81,DBNUMBER:=0,BYTEOFFSET:=1);
myReal:=LOG((X)/(y));
myReal:=10**(2);
myReal:=LOG(X/(y));
%DB1.DBX1.0:=myBool;
myByte:=%IB1;
myReal:=LOG(X);
myReal:=LOG((X)/(y));
myReal:=LOG(X/(y));
myReal:=LOG(X/(y));(fg)
END_FUNCTION[/code]
Sieht jemand meinen Fehler warum nicht alle Beispiele ersetzt werden?
Mein Logger zeigt aber das alle Beispiele gesucht und versucht werden zu ersetzen.
BTW: Sry, das ist meine erste Python Erfahrung. Kann sein das man diese Funktion etwas effizienter machen kann.
Re: Text zwischen zwei Zeichen aus Datei suchen und ersetzen
Verfasst: Samstag 18. März 2017, 08:54
von wbach
Ok, habe das auch gelöst.
Habe die For-Schleife falsch angeordnet.
Danke fürs zuhören
