2017-01-03 2 views
0

ich eine XML-Datei mit der folgenden Zeile haben:re.sub() führt keine Leerzeichen und neue Zeilen

  <CREATION_DATE>XXX</CREATION_DATE> 

Thought:

  <CREATION_DATE>2009-12-20T10:47:07.000Z</CREATION_DATE> 

dass ich mit dem folgenden ersetzen möchten es wäre ziemlich einfach mit dem re Modul im Python-Skript, das ich ändern soll. Ich habe etwas von der Art:

if '</CREATION_DATE>' in ligne: 
    out_lines[i] = re.sub(r'(^.*<CREATION_DATE>).*(</CREATION_DATE>.*$)', r'\1XXX\2', ligne) 

Das Feld mit dem Datum korrekt ersetzt wird, aber die Hinter neue Linie und Vertiefung werden in dem Prozess verloren. Ich versuchte, ligne und das Ergebnis der sub Funktion zu einer rohen Zeichenkette mit .encode('string-escape') zu konvertieren, mit keinem Erfolg. Ich bin ein Neuling in Python, aber ich bin ein bisschen an Regex gewöhnt, und ich kann wirklich nicht sehen, was ich falsch mache.

+0

Kann nicht reproduziert werden. Sind Sie sicher, dass etwas anderes den Einzug und den abschließenden Zeilenumbruch nicht herausgefiltert hat? – glibdud

+0

Ich teste gerade in einem Interpreter und es funktioniert so, wie ich es vorhabe, ich denke, etwas ist falsch in der Behandlung von Variable "Ligne" Upstream ... –

+0

kann auch nicht reproduzieren. Ich habe [hat Ihr Skript läuft] (https://gist.github.com/philippkeller/b6603df2bcb144f5097955d0f3fa24f2) und es machte, was Sie in Python 2.7 wollte – hansaplast

Antwort

2

Eine Alternative, eine einfachere und zuverlässigere Möglichkeit, den Text eines XML-Elements zu ersetzen, wäre die Verwendung eines XML-Parsers. Es gibt sogar one in the Python Standard Library:

>>> import xml.etree.ElementTree as ET 
>>> 
>>> s = '<ROOT><CREATION_DATE>2009-12-20T10:47:07.000Z</CREATION_DATE></ROOT>' 
>>> root = ET.fromstring(s) 
>>> root.find("CREATION_DATE").text = 'XXX' 
>>> ET.tostring(root) 
'<ROOT><CREATION_DATE>XXX</CREATION_DATE></ROOT>' 
0

Wie in den Kommentaren erwähnt, wurde die variable ligne gestrippt von Rohlingen und neuen Linien mit ligne = ligne.strip() an anderer Stelle im Code ... Ich bin zu löschen meine Frage nicht aber, weil alecxe Antwort auf dem XML-Modul ist sehr informativ.