2011-03-19 41 views
1

我解析XML文件(以下稱爲XML)有兩個不同類型的線路:的Python的findall和正則表達式

1. <line a="a1" b="b1" c="c1"> 
2. <line a="a2" c="c2"> 

我試圖拉A2和C2僅從第二類型,然而這正則表達式還捕獲第一種類型:

>>> list = re.findall('<line a="(.*)" c="(.*)">', xml) 
>>> print(list) 
[('a1" b="b1', 'c1'), ('a2', 'c2')] 

我該如何捕獲第二種類型?

+2

爲什麼使用正則表達式來解析XML以開始?它們並不完全正常...您是否看過[ElementTree](http:// docs.python.org/library/xml.etree.elementtree.html),例如? – Santa 2011-03-19 01:42:33

回答

4

*操作符默認爲貪婪。嘗試使用([^「] *)而不是(。*)

7

這對於像ElementTree這樣的合適的XML解析庫更有意義,而不是求助於正則表達式。例如:

>>> xmlstr = """\ 
... <root> 
... <line a="a1" b="b1" c="c1"></line> 
... <line a="a2" c="c2"></line> 
... </root> 
... """ 
>>> import xml.etree.ElementTree as ET 
>>> root = ET.XML(xmlstr) 
>>> root.findall('./line') 
[<Element 'line' at 0x226db70>, <Element 'line' at 0x226de48>] 
>>> filtered = [line for line in root.findall('./line') if line.get('b') is None] 
>>> for line in filtered: 
...  print ET.tostring(line) 
... 
<line a="a2" c="c2" /> 

>>> 
+0

我通過timeit運行它,正則表達式解決方案速度快了50倍,所以如果速度很重要,那麼你知道你在找什麼因爲你知道什麼樣的XML你得到然後去正則表達式的方式可能是更好的選擇 – ChrisWue 2011-03-19 06:47:50

+0

以可維護性和可讀性爲代價還有'cElementTree'實現相同的API,但在本地C作爲擴展模塊。如果速度對你來說很重要,爲什麼首先使用Python?;-) – Santa 2011-03-20 10:25:37

+0

感謝您提供這種方法,它對於我正在處理的其他任務非常有用。 – Jeff 2011-04-02 01:07:51