hallo zusammen,
vielen, vielen Dank für eure Antworten! Erst mal vorweg Entschuldigung, dass es etwas länger gedauert hat mit dem Antworten ... aber da ich noch nicht so geübt bin mit Python, musste ich erst mal viel lesen um euch hoffentlich unnötige Fragen zu ersparen.
Auch wenn ich die Lsg lleider immer noch nicht habe, habe ich schon wieder eine Menge dazugelernt
@ problembär : ich muss offen zugeben ich habe es versucht, aber deinen Lösungsvorschlag nicht wirklich verstanden ... was aber glaube ich noch eher an meinem (noch) eingeschränkten Pythonverständnis liegt, als an deinem Stückchen Code
Wenn ich es versuche an einem Minimalbsp. laufen zu lassen, um zu schauen was es macht bekomme ich die Fehlermeldung:
NameError: name 'substr1' is not defined
@martin : bei dir bin ich etwas weiter gekommen, bin aber leider noch nicht ganz am Ziel.
hier mal das Minimalbeispiel mit dem ich versucht habe das Programm zu optimieren:
Hallo sie fahren gerne einen gruenen Hund .
Hallo sie driven gerne einen gelben Hund .
Hallo sie flitzen gerne einen blauen Hund .
FIX [XAa1 var1 XAa2] [XAb1 var2 XAb2] FIX
Ziel ist es folgenden (wenn auch zugegebenermaßen sinnfreien) Text herauszubekommen.
Hallo viele gruenen Hasen du fahren ungerne .
Hallo viele gelben Hasen du driven ungerne .
Hallo viele blauen Hasen du flitzen ungerne .
FIX [XBb1 var2 XBb2] [XBa1 var1 XBa2] FIX
So wenn ich das Programm jetzt anpasse (siehe Code) das es einen Textfile aufruft mit dem Ausgangstext und das folgende Skript drüber laufen lasse und in ein neues Dokument schreibe erhalte ich folgendes Ergebnis:
Code: Alles auswählen
#!/usr/bin/env python
import re
fh = open('cleo.txt','r')
stuff = fh.read()
fh.close()
old_text = 'sie /* gerne '
old_text2 = 'einen /* Hund '
pattern = re.compile(r'\w+(<[\w|\s]*>)\w+')
new_text = pattern.sub(r'du\1ungerne ', old_text,)
new_text2 = pattern.sub(r'viele\1Hasen', old_text2)
fh = open('cleo.txtt','w')
fh.write(new_text2)
fh.write(new_text)
fh.close()
Ausgabe (in cleo.txtt):
einen /* Hund sie /* gerne
1. Mit /* habe ich versucht den variablen Text zu fischen, habe verschiedenstes ausprobiert (<.*>, *, "*",...) habe aber immer nur die eins zu eins Ausgabe wie in diesem Bsp. oder ein Kästchen erhalten.
Der Variable Teil ist leider immer unterschiedlich, an der Stelle muss ich irgendwie eine Wildcard verwenden.
2. Das Skript hat zwar die Reihenfolge gedreht, aber die vom alten Text. Wenn ich allerdings die Reihenfolge im pattern.sub umgedreh, dann klappts (zumindest die Reihenfolge).
Code: Alles auswählen
new_text = pattern.sub(old_text,r'du\1ungern ')
new_text2 = pattern.sub(old_text2,r'viele\1Hasen ')
Ausgabe:
viele\1Hasen du\1ungern
3. Es gibt mir nie den vollständigen Text aus.
Bisher ist das immer geschehen indem ich nach der Substitution noch ",stuff" hatte, aber im pattern.sub scheint es nach diesen Regeln nicht zu funktionieren.
entsprechend
Code: Alles auswählen
new_text = pattern.sub(r'du\1ungerne ', old_text,stuff)
new_text2 = pattern.sub(r'viele\1Hasen', old_text2,stuff)
Die Fehlermeldung lautet dann:
TypeError: an integer is required
Ich habe leider aber nicht herausgefunden nach welchen Regeln es funktioniert.
So, ist jetzt leider etwas mehr Text geworden, hoffe es hält sich noch im Rahmen. Ich hoffe das ich nicht einfach nur eine triviale Lsg übersehen habe und das ihr mir vielleicht noch einmal ein bisschen auf die Sprünge helfen könnt
Vielen lieben Dank auf jeden Fall schon mal im Voraus für eure Hilfe.
MfG Cleo