2012-09-04 41 views
0

可能重複地圖:
RegEx match open tags except XHTML self-contained tags如何mutlitple​​標籤在<tr>標籤使用正則表達式在Python

我必須在python使用正則表達式在一個<tr>多個<td>數據映射

例如

<tr> 
    <td>data 1</td> 
    <td>data 2</td> 
    <td>data 3</td> 
</tr> 

我想使用單個正則表達式提取data1,data2,data3。並且可以有任何數量的<td>標籤。

目前我第一個使用多正則表達式,即我映射<tr></tr>然後<td></td>

我能做到在單一的表達?

我想使用正則表達式來實現這一點,所以我不能使用美麗的湯或其他html解析器。

+7

你應該用解析HTML解析器HTML而不是用正則表達式 – zenpoy

+2

只要你能保證沒有嵌套的標籤,你可能是正常的...但正則表達式_CANNOT_匹配嵌套項目正確... –

+3

*「我想使用正則表達式來實現這一點,所以我不能使用美麗的湯或其他HTML解析器。」*。對不起,這有點像是用叉子幫忙刺你的眼睛。你通常不想這樣做,因爲這不是一個好主意!你有沒有更強的理由不想使用HTML解析器? –

回答

2

編輯:我明白了,小馬,他來了。我也時不時傳播這個詞,因爲我完全同意這個觀點。但是這種看法似乎在上面的評論中已經充分表達出來了,所以我的目的只是爲了回答字面問題,「我可以在單個表達式中完成嗎?」用一個簡單的方法:「不,除了在.NET中,所以一起移動。」


爲了回答您的實際問題:

不,你不能這樣做在一個單一的表達,除非你使用.NET,其中,所以我聽說,提供用於捕獲匹配的每個實例在一個量化的表達式內。

你可以做的最好的是有限的,非任意的重複,例如,

/<tr>(?:\s*<td>(.*?)</td>)?(?:\s*<td>(.*?)</td>)?(?:\s*<td>(.*?)</td>)?(?:\s*<td>(.*?)</td>)?\s*</tr>/ 

當然,上面是原油和不考慮任何其他標記,註釋等我僅僅意味着舉例說明「有限的,非任意」的一部分。

3

雖然,正如其他人的建議,你應該分析的東西設計的任務你的HTML,下面將案件的一個子集工作:

re.findall(r'(?i)<td.*?>([^<]+)</td.*?>', input_str) 

根據您的HTML的格式輸入,在使用re.findall()之前,您可能需要將其轉換爲字符串。下面將從file.html在一個叫做data列表讀取和存儲任何匹配:

import re 

fh = open('file.html', 'r') 
input_str = fh.read() 
data = re.findall(r'(?i)<td.*?>([^<]+)</td.*?>', input_str) 
fh.close()