Seite 1 von 1

Reg Expression / String teilweise ersetzen

Verfasst: Dienstag 11. August 2009, 12:08
von Kreavis
Hallo,

folgende Aufgabenstellung:

ich möchte mit einem Pythonskript den mittleren Teil eines Strings in einem Batch File ersetzen.
Beispiel für einen String:

set K1=MXAZB.A2009214.0630.XXX

Der fett gedruckte Teil soll dabei ersetzt werden.

Ist hierfür der Einsatz von Regular Expressions nötig, oder kann ich das einfacher durchführen. Der Teil vor und nach dem fett gedruckten bleibt immer gleich.

Ein kleines Beispiel wäre super. Habe mir Dokumentationen zu Reg.Exps. angesehen, wollte aber nicht Kannonen auf Spatzen...

Danke für Hinweise
Kreavis

Verfasst: Dienstag 11. August 2009, 12:23
von Hyperion
Wie wärs damit?

Code: Alles auswählen

>>> line = u"set K1=MXAZB.A2009214.0630.XXX"
>>> pattern = (u"set K1=MXAZB.", u".XXX")
>>> if line.startswith(pattern[0]) and line.endswith(pattern[1]):
...     True
...
True
>>> new_line = u"{0}{1}{2}".format(pattern[0], u"Ich bin neu", pattern[1])
>>> new_line
u'set K1=MXAZB.Ich bin neu.XXX'

Verfasst: Dienstag 11. August 2009, 12:26
von EyDu
Wenn das Format immer so einfach, dann kannst du es so machen:

Code: Alles auswählen

>>> s = "MXAZB.A2009214.0630.XXX".split(".")
>>> s[1] = "spam"
>>> ".".join(s)
'MXAZB.spam.0630.XXX'

Verfasst: Dienstag 11. August 2009, 12:27
von cofi
Das kommt natuerlich drauf an, wie die Strings aussehen.
Wenn sie dem Muster

Code: Alles auswählen

 set var=*.RELEVANT.*
folgen, kannst du den String auseinadernehmen und wieder zusammensetzen:

Code: Alles auswählen

def replace_middle(s, new):
    variable, value = s.split('=')
    values = value.split('.')
    values[1] = new
    return '%s=%s' % (variable, '.'.join(values))
Allerdings ist ein RegExp auch nicht wirklich ueberdimensioniert dafuer.

Verfasst: Dienstag 11. August 2009, 12:29
von Hyperion
EyDu hat geschrieben:Wenn das Format immer so einfach, dann kannst du es so machen:

Code: Alles auswählen

>>> s = "MXAZB.A2009214.0630.XXX".split(".")
>>> s[1] = "spam"
>>> ".".join(s)
'MXAZB.spam.0630.XXX'
Dann bleibt aber ja das ".0630" erhalten! Zum Fett-Gedruckten haben wir leider keine genauen Infos bekommen, daher ging ich davon aus, dass das wirklich beliebig sein kann.

Edit: Gleiches gilt für Cofi's Lösung. Wenn kein oder mehrere Punkte im relevanten Teil stehen, funzt es so nicht.

Verfasst: Dienstag 11. August 2009, 12:31
von cofi
Hyperion hat geschrieben:Dann bleibt aber ja das ".0630" erhalten!
Hm das stimmt. Den Punkt hab ich auch ueberlesen. Das anzupassen ist aber nun wirklich eine Kleinigkeit.

Verfasst: Dienstag 11. August 2009, 12:42
von Kreavis
Erstmal danke, dass gleich so viele konstruktive Antworten gepostet werden.

Der Fettgedruckte Mittelteil sieht immer so aus:
JulianischesDatum.Uhrzeit, z.B. 2009214.0630

Der fordere und der hintere Teil bleiben immer gleich. Allerdings ist dies nur eine von mehreren Zeilen in dem Batch file.

Ist dann der Ansatz über ein Pattern am "einfachsten" um die gewünschte Zeile zu finden?

Ich werde mal die genannten Ansätze ausprobieren.

Vielen Dank!

Verfasst: Dienstag 11. August 2009, 12:47
von Hyperion
Kreavis hat geschrieben: Ist dann der Ansatz über ein Pattern am "einfachsten" um die gewünschte Zeile zu finden?
Naja, ich zeige immerhin, wie man diese Zeile findet (Du musst jetzt ja nur noch über alle Zeilen iterieren ... was mit der readlines()-Methode eines file-Objektes einafch ist). Das zeigen die beiden anderen nicht. Ich halte das für einen sehr einfachen (und daher auch unflexiblen!) Ansatz. Aber wenn Du wirklich nur exakt das brauchts und sich sonst nie etwas ändert, dann halte ich das so für ok.

Verfasst: Dienstag 11. August 2009, 13:10
von cofi
Man kann allerdings auch direkt ueber das File-Objekt iterieren, dazu braucht man ``readlines`` nicht.

Verfasst: Mittwoch 12. August 2009, 10:03
von sma
IMHO ist reguläre Ausdrücke keine Kanonen, sondern bilden die einfachste (jedenfalls die kürzeste) Lösung:

Code: Alles auswählen

print re.sub(r"(set K1=)(.*?)(.XXX)", r"\1<foo>\3", "set K1=MXAZB.A2009214.0630.XXX")
Stefan