2011-11-02 142 views
0

我試圖分析包含在形式解析註釋文件

<name> James Gold 

</name> said to meet with <name> Mable Helen </name> tomorrow night 

我試圖用正則表達式的Python做這個人名註釋的文件,但它不能正常工作。我使用

annotation = re.findall(' <name>(.*)</name>', lines) 

我想收回<name>標籤內的所有項目,但這些標記可能是在不同的行。我嘗試連接所有行並刪除換行符,但無濟於事。有任何想法嗎?

回答

4

假設它僅僅是一個註釋文件,而不是一個XML文件(使用橡果國際在這種情況下的解決方案),你應該使用一些re標誌來跳過換行符並使用.更好:

>>> src = """<name> James Gold 
... </name> said to meet with <name> Mable Helen </name> tomorrow night""" 
>>> 
>>> [s.strip() for s in re.findall(r'<name>(.*?)</name>', src, re.DOTALL)] 
['James Gold', 'Mable Helen'] 

然後,只需strip結果得到一個正確的字符串,如果它碰巧跳過一個換行符。此外,您的正則表達式丟失了?運營商:因此它正在消耗一切,直到最後一個</name>標籤。

+1

're.MULTILINE'只與'^'和'$'特殊字符有關,如果這些特殊字符只與整個字符串或其所有行有關,則控制它們。所以這裏似乎並不需要... – glglgl

+0

非常感謝你!你的方法工作完美! – Duke

+0

@glglgl:完全正確,更新了匹配的答案。 – jro

3

如果您正在解析的內容是XML,則不應使用正則表達式。使用解析器,如lxml

import lxml.etree as et 

xml=""" 
<root> 
<name> James Gold 

</name> said to meet with <name> Mable Helen </name> tomorrow night 
</root> 
""" 

tree=et.fromstring(xml) 

for name in tree.xpath("//name"): 
    print name.text.strip() 

結果:

 
James Gold 
Mable Helen 
+0

從他發佈的內容來看,它不一定是xml。 – rplnt

+0

是的,該文件不是xml。它只是一系列帶有註釋名稱的文本。例如 Kate,Power Marketing。你可以談談馬洛裏關於交易對手的名字。 – Duke

0

我同意Acorn,你應該使用XML解析器。如果你必須使用一個正則表達式(如果它是一個學校作業或其他東西),你會想要使用re.S標誌。這個。運算符默認不匹配換行符。 re.S將強制它匹配換行符。但是那麼你的。*組合很貪婪,並且會比你想要的更匹配,所以你必須調整你的表情。

+0

這不是一個學校作業。這是我正在研究的一個項目。我試過lxml,但它在文件上拋出錯誤。我猜這是因爲該文件有標籤,如沒有關閉。我只需要調整我的輸入有點 – Duke

+0

如果你能控制文件格式,讓生活變得容易多了,我會想。無論哪種方式祝你好運! –