Text zwischen zwei Zeichen aus Datei suchen und ersetzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
wbach
User
Beiträge: 7
Registriert: Mittwoch 8. März 2017, 15:23

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
Zuletzt geändert von Anonymous am Mittwoch 8. März 2017, 15:51, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
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.
wbach
User
Beiträge: 7
Registriert: Mittwoch 8. März 2017, 15:23

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 :D

LG
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/
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
wbach
User
Beiträge: 7
Registriert: Mittwoch 8. März 2017, 15:23

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
wbach
User
Beiträge: 7
Registriert: Mittwoch 8. März 2017, 15:23

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.
Zuletzt geändert von Anonymous am Samstag 18. März 2017, 18:49, insgesamt 1-mal geändert.
Grund: Quelltext in Codebox-Tags gesetzt.
wbach
User
Beiträge: 7
Registriert: Mittwoch 8. März 2017, 15:23

Ok, habe das auch gelöst.
Habe die For-Schleife falsch angeordnet.

Danke fürs zuhören :D
Antworten