Muster 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
andrejg
User
Beiträge: 4
Registriert: Mittwoch 14. Juni 2006, 15:00
Wohnort: Puderbach

Hallo zusammen,

da ich in der Python-Programierung, brauche ich eure Hilfe.
Ich möchte Muster, die aus festen und variablen Teilen bestehen, in eine ASCII-Datei suchen und unter berücksichtigung der variablen Bestandteilen des Strings die Ersetzung vornehmen.
Folgendes habe ich zusammen gekriegt. Das funktioniert auch soweit, aber obwohl in der Datei mehrere Muster zufinden wären findet der Skript den ersten und ersetz alle anderen mit den Werten des ersten Treffers.

Code: Alles auswählen

import os
import re
import glob
import string

version = 'PyJmp 0.001'
cdir=os.getcwd()
indir = cdir + "\\test"
outdir = cdir + '\\test_erg'
os.chdir(indir)
dateiliste = glob.glob('*.sgm')


for dateiname in dateiliste:
    f = open(dateiname, 'r')
    inhalt = f.read()
    f.close()
    patternSprung = '(?P<sprung>EzA § (?P<para>[0-9]+) (?P<gesetz>.*?) Nr. (?P<lsnr>[0-9]+))'
    regexpSprung = re.compile(patternSprung, re.DOTALL)
    regobjectSprung = regexpSprung.search(inhalt)
    inhaltSprung = regobjectSprung.group()
    inhaltSprung = regexpSprung.sub('<!-- ' + version + ' --><Sm PgNr="\g<para>" GsNm="\g<gesetz>" LsNr="\g<lsnr>">\g<sprung></Sm>', inhaltSprung)
    inhalt = regexpSprung.sub(inhaltSprung, inhalt)
    outfile = os.path.join(outdir,dateiname)
    f = open(outfile, 'w')
    f.write(inhalt)
    f.close()
Was mach ich falsch?

gruß andy
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Ich vermute, dass dein "patternSprung" zu greedy ist, da .*? alles Folgende matcht, und "Nr." (wo vmtl der Punkt escaped sein sollte) möglicherweise mitnimmt.
Könntest du vielleicht einen "inhalt" posten, so wie das gewünschte und das tatsächliche Ergebnis?

Hilfreich ist oft, sich erstmal ganz ohne das Programm drumrum, den Regulären Ausdruck (z.B. mit http://kodos.sourceforge.net/) vorzunehmen, und gucken, was genau falsch läuft.
andrejg
User
Beiträge: 4
Registriert: Mittwoch 14. Juni 2006, 15:00
Wohnort: Puderbach

Hallo keppla,

ich versuche folgendes zu erreichen:

Suchmuster:

Code: Alles auswählen

<Ez>EzA § 12 ArbGG Nr. 1</Ez>
<Ez>EzA § 13 BGB Nr. 2</Ez>
das Ergebnis soll so aussehen:

Code: Alles auswählen

<Ez><!-- PyJmp 0.001 --><Sm PgNr="12" GsNm="ArbGG" LsNr="1">EzA § 12 ArbGG Nr. 1</Sm></Ez>
<Ez><!-- PyJmp 0.001 --><Sm PgNr="13" GsNm="ArbGG" LsNr="2">EzA § 13 ArbGG Nr. 2</Sm></Ez>
Das ist nur ein Beispiel das Suchmuster kann noch komplexer werden.
Wie komme ich meinem Ziel näher?

gruß andy
Antworten