PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Python Regex-Problem



SeeksTheMoon
31-12-2005, 12:52
Ich habe viele LaTeX-Dateien in denen ich Bilder eingebunden habe. Im Laufe der Zeit sind wegen Bearbeitungen der Texte die Bilder teilweise aus den tex-Dateien verschwunden, existieren aber noch in meinem Bilderverzeichnis. Diese Verwaisten Bilder will ich mit einem Pythonscript aufspühren, was bis auf zwei Macken klappt.

1. Prob: Ich habe ein Problem auskommentierte Zeilen zu behandeln
2. Prob: Einträge die matchen müssten, tun es nicht.

Beispiel was gematcht werden soll:

\includegraphics[scale=0.33]{Bilder/Legende}

Verwendeter Regex-String:

"\\includegraphics.*"+image+"\}"

image ist immer "Bilder/"+Dateiname ohne Endung, das setze ich in einer Schleife ein.
Für obiges Beispiel wäre der Regex also

\\includegraphics.*Bilder/Legende\}

Das ist soweit kein Problem, aber: Steht vor dem \includegraphics irgendwo, irgendwie ein "%" Zeichen, dann darf der Regex nicht matchen.
Ich will vom Zeilenanfang beliebige Zeichen zulassen, dann muss ein % rausgematcht werden und dann können bis zum includegraphics wieder beliebige Zeichen kommen.
Ich beginne den Regex dann mit

^.*(?!%).*\\includegraphics....
aber das klappt nicht, denn folgender Eintrag wird trotzdem gematcht:

%\includegraphics[scale=0.33]{Bilder/Legende}


Zweites Prob:

\includegraphics[scale=0.90]{Bilder/Nadelspitze}
wird nicht gematcht. Dabei sehen alle includes ausnahmslos so aus, z.B. steht
\includegraphics[scale=0.90]{Bilder/Jagdpfeil} direkt darüber und wird gematcht...:confused:

RapidMax
01-01-2006, 16:46
Ich habe das mal kurz versucht. Schau ob es funktioniert und stelle Fragen, zu teilen, die unklar sind. Der Trick dabei ist, dass ".*" soviel wie möglich an Zeichen isst, während man mit "[^{]*\{" sicher vor der geschweiften Klammer stoppt. Kommentarzeilen werden dadurch ausgelassen, indem verlangt wird, dass die Zeile entweder nicht mit einem '%' gefolgt von beliebigen Zeichen beginnt oder die Zeile mit einem Backslash anfängt.


#!/usr/bin/python
import re, sys
search = re.compile(r'^([^%].*\\|\\)includegraphics[^{]*\{(?P<image>[^}]+)\}')

f = file(sys.argv[1], 'r')

for line in f:
m = search.match(line)
if m:
print m.groupdict()['image']

f.close()


Gruss, Andy

SeeksTheMoon
05-01-2006, 01:39
das findet keine Images, aber es gibt welche die gefunden werden müssen