regulaere Ausdruecke - string Substitution

Hallo zusammen, nach dem ich mich neulich erst in das re-modul eingearbeitet habe brauch ich zu diesem Thema noch einmal Hilfe. Erstmal eine kleine Erklaerung: Ich habe als Ausgangslage ein unformatierten xml-String (da ich cElementTree verwende). Der wird dann spaeter in einer GUI weiterverarbeitet. Jedoch soll es dem Benutzer auch moeglich sein direkt auf der Konsole Statusinformationen durch diesen xml-String zu gewinnen. Dazu muss ich zunaechst erst mal einen PrettyPrinter (aus Sax2) bemuehen, wofuer ich wiederum ein stream benoetige (deshalb StringIO) Nun aber das eigentliche Problem: ich moechte die Attribute mit escape-sequenzen einfaerben, die "human maschine" braucht sonst zu lange zum parsen ;-). Für die Statusinformationen "online/offline" ist das noch relativ einfach mit einem str.replace getan, wobei ich das auch nicht sooo toll finde, da ich dies in diesem Bsp. zweimal machen muss und mir dabei auch noch jedesmal ein neues Objekt erzeugt wird, ich haette von MutableString ein "inPlace" replace erwartet - aber ok - das kann man ja noch selbst ueberschreiben. So nebenbei: das das re Modul nicht mit UserStrings zusammenarbeitet ist auch nicht so huebsch. Naja, auf jeden Fall passt der regulaere Ausdruck fuer das markieren von "Nummernspalten" nicht. Ich moechte bei allen Attribute mit Zahlenwerten diese einfaerben. Fuer den ersten Treffer klappt es zwar (siehe "instance") aber das wars auch schon. Hier mal das Original: <?xml version='1.0' encoding='UTF-8'?> <Environment name='Entwicklung'> <Server alias='clusterline' status='online' host='rothut11' instance='1' name='clusterline' errors='0'> <Client alias='clr2' status='offline' host='rothut11' instance='0' name='clr2' errors='0'/> <Client alias='clr1' status='online' host='rothut11' instance='2' name='clr1' errors='0'/> <Client alias='clv2' status='offline' host='rothut11' instance='0' name='clv2' errors='0'/> <Client alias='clv1' status='offline' host='rothut11' instance='0' name='clv1' errors='0'/> </Server> ... und das (haessliche) Ergebnis (z.B. beim ersten "namen" zu sehen:clusterline ->clusterl0ne) : <?xml version='1.0' encoding='UTF-8'?> <Environment name='Entwicklung'> <Server alias='clusterline' status='online' host='rothut11' instance='1' name='clusterl0ne' errors='0'> <Client alias='clr2' status='offline' 0ost='roth0t11' instance='0' name='clr2' errors='0'/> <Client ali2s='clr1' 0tatus='online' host='rothut11' instance='2' name='clr1' err0rs='0'/> 0 <Client alias='clv2' status='offline' host='rothut11' in0tance='0'0name='clv2' errors='0'/> <Client alias='clv1' status='offline' hos1='rothut11'7048tance='0' name='clv1' errors='0'/> </Server> Da ich keine HTML-Mail verfassen wollte/darf sieht man zwar die Farben nicht aber auf jedenfall das die nummerischen Werte irgentwo mittendrin landen. Und hier der Code dazu: from xml.dom.ext.reader import Sax2 from xml.dom.ext import PrettyPrint import StringIO, UserString xmlString= self._export(cmd='status') reader= Sax2.Reader() doc= reader.fromString(xmlString) buffer= StringIO.StringIO() PrettyPrint(doc, stream=buffer) xmlString= buffer.getvalue() buffer.close() mutableXMLString= UserString.MutableString(xmlString) for match in re.finditer("'(\d*)'", xmlString): mutableXMLString[match.start()+1:match.end()-1]="\x1b[01;33m%s\x1b[00m" % match.group(1) xmlString= mutableXMLString.replace('online','\x1b[01;32monline\x1b[00m') xmlString= xmlString.replace('offline','\x1b[01;05;37;41moffline\x1b[00m') print xmlString Also wenn jetzt jemand sieht warum: for match in re.finditer("'(\d*)'", xmlString): mutableXMLString[match.start()+1:match.end()-1]="\x1b[01;33m%s\x1b[00m" % match.group(1) nicht alle nummerischen Attribute trifft waere ich fuer eien Tip sehr dankbar. PS: Ja - ich weiss das "host" redundant ist. Gruesse Steffen _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Steffen Oschatz wrote:
Hallo zusammen,
nach dem ich mich neulich erst in das re-modul eingearbeitet habe brauch ich zu diesem Thema noch einmal Hilfe. Erstmal eine kleine Erklaerung:
Ich habe als Ausgangslage ein unformatierten xml-String (da ich cElementTree verwende). Der wird dann spaeter in einer GUI weiterverarbeitet. Jedoch soll es dem Benutzer auch moeglich sein direkt auf der Konsole Statusinformationen durch diesen xml-String zu gewinnen. Dazu muss ich zunaechst erst mal einen PrettyPrinter (aus Sax2) bemuehen, wofuer ich wiederum ein stream benoetige (deshalb StringIO)
Nun aber das eigentliche Problem: ich moechte die Attribute mit escape-sequenzen einfaerben, die "human maschine" braucht sonst zu lange zum parsen ;-). [...]
Dann würde ich doch einen anderen Weg gehen, und einen eigenen XML-PrettyPrinter schreiben. Der hat dann ja Zugriff auf alle Elemente und Attribute, während er diese durchwandert und kann entsprechende Formatierungen durchführen. Wenn ich das XML eh schon in einem DOM habe, warum sollte ich dann reguläre Ausdrücke auf das serialisierte XML loslassen ;-) -- Gerhard _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (2)
-
Gerhard Häring
-
Steffen Oschatz