2017-10-29 12 views
0

私は非常にPythonに慣れていて、数週間前にそれを使ってコーディングを始めました。以来、私は研究と読書の問題を解決することができました。しかし、この問題は数時間以来私に頭痛を与えています。私は正しい解決策を見つけるために縫い合わせることができません。python 3.x multiline regexに関する問題?

ハード_ディスク上のサンプルxml(test_file.xml)を、自分のread_xml.pyファイルもあるフォルダに作成しました。 read_xml.py(前)の

コンテンツは

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)) 

それがすべきTinkerTry戻って私を与えます。

しかし、私はread_xml.pyのこの

コンテンツ(今)のように、さらに行けば:

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)) 

それは/もう何も一致見つけるために縫い目はありません...要するに

答えて

1

:ドン't。あなたがPython(または他の言葉で言えば)学習状態にある場合、正規表現でXMLノードを分析しようとすると通常an anti-patternとみなされます。代わりに、パーサを使用します(これは、それが作成されたものです)。


あなたの具体的な例では、これはに降りてくるかもしれません:

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

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

そして利回り

あなたが見
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 


、これはコードを理解するためにクリーンで良い方向になります。最初に lxmlpip install lxmlをインストールする必要があります。

注: XMLファイルにエラーがありましたが、これを修正する必要がありました(linkタグは開かれましたが閉じられません)

+0

クイックリプレイのおかげで、組み込みのxml.etree.ElementTreeよりlxmlの利点は何ですか? – Yves

+0

エラー報告関数が良く、 'HTML'をサポートしています。 – Jan