2017-10-29 4 views
0

Ich bin sehr neu in Python und begann vor ein paar Wochen damit zu programmieren. Seit dem war ich in der Lage, alle Probleme beim Recherchieren und Lesen zu lösen. Aber dieses Problem gibt mir jetzt Kopfschmerzen seit mehreren Stunden und ich kann nicht säumen, um die richtige Lösung zu finden.Probleme mit Python 3.x Multiline Regex?

Ich habe ein Beispiel xml (test_file.xml) auf meiner Festplatte in dem Ordner erstellt, in dem sich auch meine Datei read_xml.py befindet.

Inhalt von read_xml.py (vor)

import re 

with open('test_file.xml') as xml_source: 
    data = xml_source.read() 
    xml_result = re.compile(r'<title>(.+?)</title>') 
    mo = xml_result.search(data) 
    print(mo.group(1)) 

gibt mir zurück TinkerTry die es sein sollte.

Aber wenn ich noch weiter gehen wie diese

Inhalt von read_xml.py (jetzt):

import re 

with open('test_file.xml') as xml_source: 
    data = xml_source.read() 
    xml_result = re.compile(r'<title>(.+?)</title>\n<link href="(.+?)"/>', re.MULTILINE) 
    mo = xml_result.search(data) 
    print(mo.group(1)) 

es nichts zu finden/passen mehr ...

Antwort

1

Kurz gesagt ist die Naht: don t. Wenn Sie sich im Lernmodus Python (oder einer anderen Sprache) befinden, wird der Versuch, XML Knoten mit regulärem Ausdruck zu analysieren, normalerweise als an anti-pattern betrachtet. Verwenden Sie stattdessen einen Parser (dafür wurden sie gemacht).


Für Ihr spezielles Beispiel könnte dies kommen auf:

from lxml import etree 
tree = etree.parse('test.xml') 
root = tree.getroot() 

for title in root.xpath("//item/title"): 
    print(title.text) 

Und Ausbeuten

It's Bugtober, with Adobe Flash crashes, numerous CVE vulnerability patches for Wi-Fi and routers, and an Intel SPI vulnerability patch for most Xeon D Supermicro SuperServers 
Supermicro Xeon D SuperServer BIOS 1.2c/IPMI 3.58 released 
Windows 10 Fall Creators Update introduces GPU monitoring features built right into Task Manager 
VMUG Advantage EVALExperience includes latest VMware vRealize Log Insight 4.5 syslog server appliance for easy vSphere, vSAN, IoT, and networking gear log file analysis 
Road-warrior productivity boosted by ASUS ZenScreen MB16AC secondary travel display that connects to Mac or PC with just one USB-C or USB 3.0 cable 


Sie sehen, macht dies für eine sauberere und besseren Code zu verstehen. Möglicherweise müssen Sie zuerst lxml über pip install lxml installieren.
Hinweis: Es gab einen Fehler in Ihrer XML-Datei, die ich korrigieren musste, damit dies funktioniert (das link-Tag wurde geöffnet, aber nie geschlossen).

+0

danke für die schnelle Wiedergabe, was ist der Vorteil von LXML über die integrierte XML.etree.ElementTree? – Yves

+0

Es hat bessere Fehlermeldefunktionen und unterstützt 'HTML'. – Jan