Seite 1 von 1

Muster suchen und ersetzen

Verfasst: Mittwoch 14. Juni 2006, 15:21
von andrejg
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

Verfasst: Mittwoch 14. Juni 2006, 15:30
von keppla
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.

Verfasst: Montag 19. Juni 2006, 07:23
von andrejg
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