Python nicht gierig Regex zu reinigen xml

Ich habe eine 'XML-Datei' Datei, die einige unerwünschte Zeichen in ihm hat

<data> <tag>blar </tag><tagTwo> bo </tagTwo> some extra characters not enclosed that I want to remove <anothertag>bbb</anothertag> </data> 

Ich dachte, die folgende nicht-gierige Substitution würde die Zeichen entfernen, die nicht richtig in <sometag></sometag>

  • Was verwende ich für eine Max-Heap-Implementierung in Python?
  •  re.sub("</([a-zA-Z]+)>.*?<","</\\1><",text) ^ ^ ^ ^ text is the xml txt. remember tag, | | put tag back without and reopen next tag read everything until the next '<' (non-gready) 

    Diese Regex scheint nur die Position zu finden, die mit dem [[]] in </tag>[[]]<tagTwo> Was mache ich falsch?

    EDIT: Die Motivation für diese Frage wurde gelöst (siehe Kommentare, ich hatte einen Streuner & in der XML-Datei, die es nicht zu analysieren hatte – es hatte nichts mit den Charakteren zu tun, die ich löschen möchte). Allerdings bin ich immer noch neugierig, ob die Regex möglich ist (und was war los mit meinem Versuch) und so lösche ich die Frage nicht.

  • Prozess-Escape-Sequenzen in einer Zeichenfolge in Python
  • HTML-Tags innerhalb von JSON (in Python)
  • Wie entdecke ich einen Unicode-Escaped-String in Python?
  • Wie kann ich die ANSI-Escape-Sequenzen aus einer String in Python entfernen
  • Wie kann man Auto-Escape in Django-Vorlagen verhindern?
  • Was ist die beste Flucht Charakter Strategie für Python / MySQL Combo?
  • 2 Solutions collect form web for “Python nicht gierig Regex zu reinigen xml”

    Der Punkt stimmt nicht mit Zeilenumbrüchen überein, es sei denn, Sie geben die re.DOTALL Flagge an.

     re.sub("</([a-zA-Z]+)>.*?<","</\\1><",text, flags=re.DOTALL) 

    Sollte gut funktionieren (Wenn es nicht geht, ist meine Pythonung schuld, nicht die Regex. Bitte korrigieren.)

    Ich denke, es ist eine gute Praxis, so genau wie möglich zu sein, wenn sie Charakterklassen definieren, die wiederholt werden sollen. Dies hilft, katastrophale Backtracking zu verhindern. Deshalb würde ich stattdessen [^<]* verwenden .*? Mit dem zusätzlichen Bonus, dass es jetzt nach dem letzten Tag streunende Zeichen findet. Dies würde die re.DOTALL Flagge nicht mehr brauchen, da [^<] mit Zeilenumbrüchen übereinstimmt.

      "</[^>]+?>[^<>]+?<" 

    In ipython:

     In [1]: a="<data> <tag>blar </tag><tagTwo> bo </tagTwo> some extra characters not enclosed that I want to remove <anothertag>bbb</anothertag></data>" In [2]: import re In [3]: re.sub( "(</[^>]+?>)[^<>]+?<" ,"\\1<",a) Out[3]: '<data> <tag>blar </tag><tagTwo> bo </tagTwo><anothertag>bbb</anothertag></data>' 
    Python ist die beste Programmiersprache der Welt.