RegEx Problem

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.
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

RegEx Problem

Beitragvon CrackPod » Dienstag 25. Juli 2006, 21:31

Hallo,

ich wollte mir ein Programm schreiben, das mir meine CSS Datei analysiert...
Bsp:
[code=]
body { color:red;}
div {color:blue;background-color:red;}
a {color:green;
font-weight:bold;}
span {color:yellow
float:left}
[/code]
Programm:

Code: Alles auswählen

#!/usr/bin/python
#-*- encoding: utf-8 -*-
import re
f = open('css.css','r')
all = f.read().replace('\t','').replace('\n','')
print all
print ''
print '-'*20
print ''
all = all.replace('}','}\n')
print all
print ''
print '-'*20
print ''

found = re.findall('[a-z][a-z0-9]([ ]|[])\{([a-z0-9\:\;\-\_\#].*)\}',all)
print found

Ausgabe:
[code=]body { color:red;}div {color:blue;background-color:red;}a {color:green;font-weight:bold;}span {color:yellowfloat:left}

--------------------

body { color:red;}
div {color:blue;background-color:red;}
a {color:green;font-weight:bold;}
span {color:yellowfloat:left}


--------------------

['dy { color:red;', 'v {color:blue;background-color:red;', 'lor:green;font-weight:bold;', 'an {color:yellowfloat:left'][/code]
Fragen:
  • Wieso werden die ersten 2 Buchstaben von den Tags abgeschnitten?
  • Wieso wird die abschliesende Klammer } abgeschnitten?
  • Gibt es irgendwo ein deutsche(s) Tutorial/Beschreibung für Python RegEx?


Greetz
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Dienstag 25. Juli 2006, 22:28

Liefert dieser reguläre Ausdruck das gewünschte Ergebnis?

Code: Alles auswählen

#!/usr/bin/python
#-*- encoding: utf-8 -*-
import re
f = open('css.css','r')
all = f.read().replace('\t','').replace('\n','')
print all
print ''
print '-'*20
print ''
all = all.replace('}','}\n')
print all
print ''
print '-'*20
print ''

found = re.findall('[a-z][a-z0-9]*\s*\{\s*[a-z0-9\:\;\-\_\# ]+\}',all)
for x in found:
    print x

Eine recht gute Einführung findet sich in DiveIntoPython ab Seite 81.

MfG
HWK
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Re: RegEx Problem

Beitragvon Leonidas » Dienstag 25. Juli 2006, 23:15

CrackPod hat geschrieben:Gibt es irgendwo ein deutsche(s) Tutorial/Beschreibung für Python RegEx?

Zwar nicht Python-Regex,, aber auch brauchbar: TB RegEx. Die Unterschiede zu Python-Regex sind eher klein, zum Vergleich guckst du dir einfach mal an, wie das in der Englischen Python Dokumentation gelöst wird.

Allerdings sind Regex keineswegs die lösung für jedes Problem und öftmals macht man sich durch reguläre Ausdrücke mehr Probleme als man löst, besonders wenn man nicht diese Regex-Denkweise hat. Klar, sie sind schon praktisch, wenn sie funktionieren, aber manchmal sind andere Lösungen besser.

Edit: Ich weiß ja nicht was bei dir rauskommen soll, aber ich hab ein wenig rumgetippt und re.findall(r'\w*? {.*}', all, re.I) rausbekommen. Vielleicht kannst du ja das als Ausgangspunkt gebrauchen?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Re: RegEx Problem

Beitragvon CrackPod » Mittwoch 26. Juli 2006, 14:23

Leonidas hat geschrieben:Allerdings sind Regex keineswegs die lösung für jedes Problem und öftmals macht man sich durch reguläre Ausdrücke mehr Probleme als man löst, besonders wenn man nicht diese Regex-Denkweise hat. Klar, sie sind schon praktisch, wenn sie funktionieren, aber manchmal sind andere Lösungen besser.

Kannst du mir für diese Lösung was besseres vorschlagen?

Leonidas hat geschrieben:Edit: Ich weiß ja nicht was bei dir rauskommen soll, aber ich hab ein wenig rumgetippt und re.findall(r'\w*? {.*}', all, re.I) rausbekommen. Vielleicht kannst du ja das als Ausgangspunkt gebrauchen?

Ja ich denke schon, danke :)
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Re: RegEx Problem

Beitragvon Leonidas » Mittwoch 26. Juli 2006, 14:35

CrackPod hat geschrieben:Kannst du mir für diese Lösung was besseres vorschlagen?

Hängt ab, was du machen willst. Denn "ich will CSS Dateien analysieren" ist zu allgemein, da kannst du auch analysieren wieviele Zeilen und Buchstaben es hat als auch analysieren welche Elemente wo überschrieben werden. Was willst du denn genau haben?

Eine andere Möglichkeit, wenn es etwas kompilizierter wird, wäre es, dass du einen CSS-Parser schreibst.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Re: RegEx Problem

Beitragvon CrackPod » Mittwoch 26. Juli 2006, 14:44

Leonidas hat geschrieben:Eine andere Möglichkeit, wenn es etwas kompilizierter wird, wäre es, dass du einen CSS-Parser schreibst.

Ja sowas.
Das Programm soll den Code checken, ob Fehler enthalten sind(fehlende { oder ; usw), Warnungen ausgeben, was besser gemacht werden könnte u.v.m..
Ist RegEx dafür geeignet oder soll ich mich lieber etwas anderem bedienen?

Greetz
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Mittwoch 26. Juli 2006, 14:57

Ich würde die Datei "per Hand" parsen, also keine Regulären Ausdrücke verwenden. Allerdings ist das nur meine Meinung, wenn jemand Gegenargumente hat, darf er sie gerne vortragen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Beitragvon CrackPod » Mittwoch 26. Juli 2006, 15:42

Leonidas hat geschrieben:Ich würde die Datei "per Hand" parsen, also keine Regulären Ausdrücke verwenden. Allerdings ist das nur meine Meinung, wenn jemand Gegenargumente hat, darf er sie gerne vortragen.

Ja super :) Danke.
Mit dem selber parsen bin ich jetz schon um ein vielfaches schneller weiter gekommen, als ich vorhin war :)
Falls es jemanden interessiert:

Code: Alles auswählen

#!/usr/bin/python
#-*- encoding: utf-8 -*-
f = open('css.css','r')
lines = f.read()

indexes = [0,]
while True:
    try:
        index = lines.index('}',indexes[-1]) + 1
    except:
        break
    else:
        indexes.append(index)

lindex = 0
for index in indexes:
    print lines[lindex:index]
    lindex = index

Ausgabe: (bei selbiger CSS Datei)
body { color:red;}

div {color:blue;background-color:red;}

a {color:green;
font-weight:bold;}

span {color:yellow
float:left}

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder