Seite 1 von 1
RE für CSS Werte...
Verfasst: Freitag 13. November 2009, 11:34
von jens
Bisher habe ich re.compile(r'#([a-fA-F0-9]{3,6})') verwendet um CSS Farbwerte zu finden.
Aber eigentlich gibt es nur Farbwerte mit 3 *oder* 6 zwichen länge und nicht 3 bis 6 Zeichen (mal abgesehen von Farbnamen)...
Weiß jemand wie ich die Re verbessern kann?
Re: RE für CSS Werte...
Verfasst: Freitag 13. November 2009, 11:49
von /me
jens hat geschrieben:Bisher habe ich re.compile(r'#([a-fA-F0-9]{3,6})') verwendet um CSS Farbwerte zu finden.
Aber eigentlich gibt es nur Farbwerte mit 3 *oder* 6 zwichen länge und nicht 3 bis 6 Zeichen (mal abgesehen von Farbnamen)...
Weiß jemand wie ich die Re verbessern kann?
re.compile(r'#([a-f0-9]{3}|[a-f0-9]{6})', re.IGNORECASE)
Verfasst: Freitag 13. November 2009, 11:58
von jens
Das funktioniert nicht ganz richtig, wenn z.B. die Farbe eine falsche Länge zwischen 4 bis 5 Zeichen hat. Denn dann matched {3} auf die ersten drei Zeichen.
Man müßte das Ende angeben, das es nicht [a-f0-9] sein darf.
Verfasst: Freitag 13. November 2009, 12:18
von Darii
Wenn du auch falsche Werte abdecken willst, nimm einfach:
Verfasst: Freitag 13. November 2009, 12:24
von jens
@Darii: Nein, das möchte ich eigentlich nicht...
Ich mache nun was anderes (vor dem extrahieren):
Code: Alles auswählen
import re
txt = """.foo { color: #123456; }
.bar1 { color: #abc; }
.bar2 { color: #83F ; }
"""
CSS_RE = re.compile(r'# *([a-f0-9])([a-f0-9])([a-f0-9]) *;', re.IGNORECASE)
print CSS_RE.sub("#\g<1>\g<1>\g<2>\g<2>\g<3>\g<3>;", txt)
Also konvertieren von 3 stellige Werte in 6 stellige.
EDIT: Neue RE, damit "#" am Anfang und ";" am Ende auch bleiben

Verfasst: Freitag 13. November 2009, 12:43
von /me
jens hat geschrieben:Das funktioniert nicht ganz richtig, wenn z.B. die Farbe eine falsche Länge zwischen 4 bis 5 Zeichen hat. Denn dann matched {3} auf die ersten drei Zeichen.
Man müßte das Ende angeben, das es nicht [a-f0-9] sein darf.
Eigentlich darf das Ende gar nichts alphanumerisches sein. Damit bekommst du:
re.compile(r'#([a-f0-9]{3}[a-f0-9]{3}?)\W', re.IGNORECASE)
Verfasst: Freitag 13. November 2009, 14:15
von Defnull
Dafür ist doch lookahead da: r'#([a-fA-F0-9]{3}){1,2}(?!\w)'
Verfasst: Freitag 13. November 2009, 15:21
von jens
Ich ende lieber mit " *;" also beliebige Leerzeichen und dann ein Semikolon...
Verfasst: Samstag 14. November 2009, 11:49
von sma
jens hat geschrieben:Ich ende lieber mit " *;" also beliebige Leerzeichen und dann ein Semikolon...
Was im Gegensatz zu defnulls negativem Lookahead aber nicht alle Fälle abdeckt. Habt ihr übrigens bedacht, dass die Alternative "erst drei, dann sechs Zeichen" zuerst den kleineren findet? Besser ist es, das umzudrehen, und zuerst auf 6 Zeichen und dann auf 3 Zeichen zu prüfen.
Korrekt gemäß CSS ist das alles natürlich nicht, denn ein "content: '#fff'" würde fälschlich als Farbe und nicht als String erkannt werden. Auch in der CSS-Datei enthaltene Kommentare können natürlich #FFF o.ä. enthalten. Nicht erkannt werden natürlich Farbdefinitionen mittels "rgb()".
Stefan
Verfasst: Samstag 14. November 2009, 17:25
von /me
sma hat geschrieben:Habt ihr übrigens bedacht, dass die Alternative "erst drei, dann sechs Zeichen" zuerst den kleineren findet? Besser ist es, das umzudrehen, und zuerst auf 6 Zeichen und dann auf 3 Zeichen zu prüfen.
Jaja, die Lösung mit der Alternative war ohnehin Mist und ist ziemlich schnell rausgeflogen.