Reg Expression / String teilweise 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
Kreavis
User
Beiträge: 11
Registriert: Dienstag 11. August 2009, 11:15

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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'
Zuletzt geändert von Hyperion am Dienstag 11. August 2009, 12:37, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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'
Das Leben ist wie ein Tennisball.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Kreavis
User
Beiträge: 11
Registriert: Dienstag 11. August 2009, 11:15

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!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Man kann allerdings auch direkt ueber das File-Objekt iterieren, dazu braucht man ``readlines`` nicht.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Antworten