[Python-de] regulaere Ausdruecke - string Substitution

Steffen Oschatz steffen.oschatz at philips.com
Don Feb 2 12:43:30 CET 2006


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