Seite 1 von 1

Reguläre Ausdrücke

Verfasst: Dienstag 7. Juli 2009, 14:25
von PNS-Richi
Hallo,

ich hab ein kleines Problem mit Regulären Ausdrücken.

Code: Alles auswählen

CONFIG = """
if X-Spam == YES {
   create dir = True
   folder = Spam
}

if X-Virus == YES {
   create dir = True
   folder = Virus
}

if From == regex([\w]*@gmx.at) {
   create dir = True
   folder = GMX
}

"""
Nun will ich einzelne Sektionen raus filtern.

if*==*{*}

Da wo ich die Wildcards gesetzt habe, diese Bereiche will ich extra haben.

Code: Alles auswählen

r = re.compile("if[\w\s\-]*==[\w\s\-\.\@\(\)\*_\[\]\\\]*\{[\w\s\n=]*\}")
r2 = re.compile("(?<=\if)[\w\s\-\.\@\(\)\*_\[\]=\\\]*(?=\{)")
r3 = re.compile("(?<=\{)[\w\s\n=]*(?=\})")
r4 = re.compile("(?<=regex\()[\w\s\-\.\@\*_\[\]=\\\]*(?=\))")

...

r = re.compile("if[\w\W]*==[\w\W]*\{[\w\W]*\}")
r2 = re.compile("(?<=\if)[\w\W]*(?=\{)")
r3 = re.compile("(?<=\{)[\w\W]*(?=\})")
r4 = re.compile("(?<=regex\()[\w\W]*(?=\))")
Irgendwie klappt das "\W" nicht, somit sehen meine Regulären Ausdrücke nach chaos pur aus.

Bei dem Bereich "regex([\w]*@gmx.at)" kann man selber Reguläre Ausdrücke angeben. Das Problem ist wenn hier drinnen ein Komplexer Regulärer Ausdruck stehen würde, dann würden meine Regulären Ausdrücke nicht mehr korrekt Arbeiten.

Hoff mal mir kann jemand helfen :)

Verfasst: Dienstag 7. Juli 2009, 14:57
von ms4py
Für dein Problem würde ich mich mal mit den Themen Lexer/Parser auseinander setzten, und das nicht rein mit regulären Ausdrücken verarbeiten. (Wird vermutlich auch nicht funktionieren, wenn reguläre Ausdrücke in dem String stehen).

Als Lösung für Python gibt es da z.B. das Programm ANTLR, hab aber noch nie damit gearbeitet.

Verfasst: Dienstag 7. Juli 2009, 15:06
von Leonidas
ice2k3 hat geschrieben:Als Lösung für Python gibt es da z.B. das Programm ANTLR, hab aber noch nie damit gearbeitet.
Für Python ist eher PLY interessant.

Verfasst: Dienstag 7. Juli 2009, 18:31
von BlackJack
Oder PyParsing.

Verfasst: Mittwoch 8. Juli 2009, 10:01
von sma

Code: Alles auswählen

print re.findall(r"(?s)if\s+(.*?)\s*==\s*(.*?)\s*{(.*?)}", CONFIG)
Stefan