Seite 1 von 1

RegEx Problem

Verfasst: Dienstag 25. Juli 2006, 21:31
von CrackPod
Hallo,

ich wollte mir ein Programm schreiben, das mir meine CSS Datei analysiert...
Bsp:

Code: Alles auswählen

body { color:red;}
div {color:blue;background-color:red;}
a {color:green;
        font-weight:bold;}
span {color:yellow
        float:left}
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: Alles auswählen

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']
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

Verfasst: Dienstag 25. Juli 2006, 22:28
von HWK
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

Re: RegEx Problem

Verfasst: Dienstag 25. Juli 2006, 23:15
von Leonidas
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?

Re: RegEx Problem

Verfasst: Mittwoch 26. Juli 2006, 14:23
von CrackPod
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 :)

Re: RegEx Problem

Verfasst: Mittwoch 26. Juli 2006, 14:35
von Leonidas
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.

Re: RegEx Problem

Verfasst: Mittwoch 26. Juli 2006, 14:44
von CrackPod
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

Verfasst: Mittwoch 26. Juli 2006, 14:57
von Leonidas
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.

Verfasst: Mittwoch 26. Juli 2006, 15:42
von CrackPod
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}