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
Reg Expression / String teilweise ersetzen
- 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.
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.
- 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
folgen, kannst du den String auseinadernehmen und wieder zusammensetzen:
Allerdings ist ein RegExp auch nicht wirklich ueberdimensioniert dafuer.
Wenn sie dem Muster
Code: Alles auswählen
set var=*.RELEVANT.*
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))
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
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.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'
Edit: Gleiches gilt für Cofi's Lösung. Wenn kein oder mehrere Punkte im relevanten Teil stehen, funzt es so nicht.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Hm das stimmt. Den Punkt hab ich auch ueberlesen. Das anzupassen ist aber nun wirklich eine Kleinigkeit.Hyperion hat geschrieben:Dann bleibt aber ja das ".0630" erhalten!
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
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!
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!
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
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.Kreavis hat geschrieben: Ist dann der Ansatz über ein Pattern am "einfachsten" um die gewünschte Zeile zu finden?
- 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.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
IMHO ist reguläre Ausdrücke keine Kanonen, sondern bilden die einfachste (jedenfalls die kürzeste) Lösung:
Stefan
Code: Alles auswählen
print re.sub(r"(set K1=)(.*?)(.XXX)", r"\1<foo>\3", "set K1=MXAZB.A2009214.0630.XXX")