2016-05-30 11 views
0

Ich habe einen Text (kein richtig geformtes XML-Dokument) mit einigen Worten in XML-Tags wie folgt aus:Python Regex für verschachtelte XML-Elemente

We have Potter the <term attrib="LINE:246">wizard</term> interacting with<term attrib="LINE:36080">witches</term> and <term attrib="LINE:360">goblins</term> talking about <term attrib="LINE:337"><term attrib="LINE:329"><term attrib="LINE:468">dark</term></term> <term attrib="LINE:375">arts</term></term> in regions to the east of Hogwarts. 

Ich brauche die Begriffe in den XML-Tags zu extrahieren. Mein Problem ist, dass ich weiß nicht, was regex soll ich ein verschachteltes Element wie diese erhalten verwenden:

<term><term>something</term><term>else</term></term> 

ich Python verwende, für meine Arbeit, und ich habe folgende für meine Arbeit versucht:

re.findall(r'(<term.+?</term>)', textfile) 

Aber ich habe so etwas wie dies:

<term><term>something</term> 

das ist schlecht, weil ich den Rest bin fehlt. Ich habe auch versucht die folgende gierige Version (was noch schlimmer):

re.findall(r'(<term.+</term>)' , textfile) 

Können Sie mir bitte helfen?

+2

Sie können http://stackoverflow.com/questions/37113364/regex-for-nested-xml-attributes informativ zu den Problemen finden, die mit dem Parsen verschachtelten XML mit Regex ... –

+0

ObZalgo: http: // stackoverflow.com/a/1732454/4014959 :) –

+0

Nur PyPi Regex-Modul bietet eine rekursive Regex. –

Antwort

1

Sie verwenden das falsche Tool für den Job. Regex-Sprachen können nicht (normalerweise) zählen, daher ist die Verwendung für solche Sachen äußerst fragil. Verwenden Sie einen geeigneten XML-Parser mit einem schönen Front-End, wie BeautifulSoup. Es wird Ihnen Zeit sparen und bessere Ergebnisse erzielen, die weniger hackisch sind als eine Regex jemals sein wird.

Siehe great docs Beispiele

-1

Vielleicht versuchen:

text = 'We have Potter the <term attrib="LINE:246">wizard</term> interacting with<term attrib="LINE:36080">witches</term> and <term attrib="LINE:360">goblins</term> talking about <term attrib="LINE:337"><term attrib="LINE:329"><term attrib="LINE:468">dark</term></term> <term attrib="LINE:375">arts</term></term> in regions to the east of Hogwarts.' 
text = re.sub("<.+?>", '', text) 
text = re.sub(" ", " ", text) 
print(text) 

Dies ist jede <tag> und </tag> dort ausgeschnitten sollte, alles andere intakt bleibt.

Natürlich wird es chaotisch sein, wenn es < Zeichen gibt, die nicht Teil eines XML-Tags sind.