2012-10-29 42 views
0

如何使用RE模塊查找除了標籤中的所有單詞?Python - 正則表達式 - 查找除標籤外的所有單詞

我知道如何找到一些東西,但如何做到這一點呢?就像我寫了一些東西來搜索,但我想搜索除了標籤和標籤本身內的所有內容之外的每個單詞?

到目前爲止,我管理這個:

f = open (filename,'r') 
data = re.findall(r"<.+?>", f.read()) 

那麼它裏面打印標籤<>一切,而是如何使它發現,除了那些標籤裏面這就是每一個字? 我試過^,用在[]裏面的模式開頭,但是那些符號如.的字面上沒有特別的意思。 此外,我設法解決這個問題,通過分割字符串,使用'''\= <>"''',然後檢查整個字符串中的<>標籤(如對齊,右,td等)內的單詞,並將不在<>標籤內的單詞追加到另一個列表中。但這有點難以解決。

是否有一些簡單的方法來搜索除<>以及這些標籤本身內部的任何內容之外的每個單詞? 所以我們說串'hello 123 <b>Bold</b> <p>end</p>'re.findall,將返回:

['hello', '123', 'Bold', 'end'] 
+4

如果你使用HTML,你有沒有考慮過像html5lib這樣的東西,而不是試圖自己計算正則表達式? http://code.google.com/p/html5lib/ – zigg

+0

好吧,我正在尋找RE的能力。還是有沒有簡單的解決這個問題?我只發現你可以排除[]中的文字字符,但是如何構造類如<.*?>。 – Andrius

+0

正則表達式確實可以做很多事情,但這並不意味着你應該使用它們來重新發明輪子,特別是對於像HTML這樣的事情來說,解析實際上相當複雜。 – zigg

回答

1

喜歡的東西re.compile(r'<[^>]+>').sub('', string).split()應該做的伎倆。

您可能想要閱讀this post關於使用正則表達式處理上下文無關語言。

+0

這個解決方案完成了大部分工作。謝謝。 – Andrius

0

刪除所有標籤(使用您的原始正則表達式),然後匹配單詞。

唯一的弱點是如果在標籤分隔符之外的字符串中存在<,或者HTML格式不正確。在這種情況下,最好使用HTML解析器。

2

對這類任務使用正則表達式並不是最好的想法,因爲你不能使它適用於每一種情況。

一個應該找出大部分這樣的話解決方案是正則表達式

\b\w+\b(?![^<]*>) 
+0

我會記住這一點,謝謝 – Andrius

2

如果你想avoid使用正則表達式,BeautifulSoup使得它很容易得到的只是從一個HTML文檔中的文本:

from BeautifulSoup import BeautifulSoup 

soup = BeautifulSoup(html_string) 
text = "".join(soup.findAll(text=True)) 

從那裏,你可以得到單詞列表與split

words = text.split() 
+0

它說沒有這樣的模塊。我想它沒有安裝在默認的Python? – Andrius

+0

這不是標準庫的一部分,沒有。按照鏈接瞭解如何下載和安裝它。 –

相關問題