2009-06-23 10 views
4

Ich verwende Python 2.x [nicht verhandelbar] zum Lesen von XML-Dokumenten [erstellt von anderen], die den Inhalt vieler Elemente Zeichen enthalten können, die keine gültigen XML-Zeichen sind unter Verwendung der _xHHHH_ Konvention z ASCII BEL alias U + 0007 wird durch die 7-stellige Sequenz u"_x0007_" dargestellt. Weder die Funktionalität, die die Darstellung eines alten Zeichens im Dokument erlaubt, noch die Art zu entkommen, ist verhandelbar. Ich analysiere die Dokumente mit cElementTree oder lxml [semi-verhandelbar].Unescene _xHHHH_ XML-Escape-Sequenzen mit Python

Hier ist mein bester Versuch unescapeing den Parser Ausgabe so effizient wie möglich:

import re 
def unescape(s, 
    subber=re.compile(r'_x[0-9A-Fa-f]{4,4}_').sub, 
    repl=lambda mobj: unichr(int(mobj.group(0)[2:6], 16)), 
    ): 
    if "_" in s: 
     return subber(repl, s) 
    return s 

Die oben vorgespannt ist durch eine sehr niedrige Frequenz von „_“ in typischem Text zu beobachten und ein besser als verdoppelt der Geschwindigkeit durch Vermeiden der Regex-Vorrichtung, wo es möglich ist.

Die Frage: Gibt es bessere Ideen da draußen?

Antwort

1

Sie könnten auch nach '_x' statt nur _ suchen, das wird nicht viel ausmachen, aber sicherlich ist die Zwei-Zeichen-Sequenz noch seltener als der einzelne Unterstrich. Abgesehen von solchen Details scheinen Sie das Beste aus einer schlechten Situation zu machen!

+0

Die Suche nach '_x' ist etwas langsamer (Python 2.6) und funktioniert nicht mit Pythons früher als 2.3. –

+0

Wie für Python 2.2 und früher, du hast Recht @John - ich nahm irgendwie 'x> = 3' (ist noch jemand mit Python 2.2 fest ....?! Wenn ja, ich bin tief enttäuscht. .. !!!). Was die relative Geschwindigkeit angeht, hängt es davon ab, wie viele isolierte '_'' Sie bekommen und wie viel langsamer die Überprüfung mit einer Regex sein kann (testen Sie nach meiner Erfahrung schnell, aber das ursprüngliche Poster sagt etwas anderes) - URL zu jedem spezifische Benchmark pls? –