2011-10-03 38 views
0

好吧,這個有點痛苦。我正在用Python進行一些修改,試圖從幾行標記不佳的HTML中找到一個地址。以下是格式示例:用正則表達式得到一個段落的地址

256-555-5555<br/> 
1234 Fake Ave S<br/> 
Gotham (Lower Ward)<br/> 

我想僅檢索1234 Fake Ave S, Gotham。有任何想法嗎?我一直在做正則表達式的整個晚上,現在我的大腦是糊塗的...

編輯: 更多關於數據如何到達的可能場景的細節。有時候第一行會在那裏,有時候不會。我所見過的所有地址都有Ave,Way,St,但我不希望將它作爲選擇的一個因素,因爲我不確定它們會一直如此。第二行和第三行是alPhone(或可能的電子郵件或網站):

我腦子裏想的是什麼東西,

  1. 選擇2日一切最後一行(因此,第二行,如果有三條線,如果沒有電話號碼,那麼只有兩行)。
  2. 選擇最後一行不在括號內的所有內容。
  3. 合併第二行到最後一行和最後一行,在兩者之間添加「,」。

我正在使用Scrapy獲取HTML代碼。地址全部在同一個div中,我想用正則表達式將數據進一步分解爲適當的部分。現在怎麼做,這是我無法弄清楚的。

EDIT2:

按奧菲爾的評論,我要指出,我已表達來隔離的電話號碼和括號部分。

電話(或可能的電子郵件或網站):

((1[-. ])?[0-9]{3}[-. ])?\(?([0-9]{3}[-. ][A?([0-9]{4})|([\w\.-][email protected][\w\.-]+)|(www.+)|([\w\.-]*(?:com|net|org|us)) 

括號:

\((.*?)\) 

我不知道如何使用這些構建的一切,但是,這些說法。

+0

你會如何指定「地址」?請詳細說明您的輸入和輸出格式。並考慮一個html解析器。 – Howard

+3

跳過正則表達式並移動到合適的html分析器,比如beautifulsoup –

+0

我實際上使用Scrapy來進行刮擦。我應該更詳細地介紹,我已經更新了描述。 – alukach

回答

1

這可能是你的情況很容易把重點放在你不想要的東西:

  • html標籤(<br>
  • 電話號碼
  • 括號一切

每一個都可以通過簡單的正則表達式輕鬆匹配,因此可以很容易地構造一個以匹配其餘的(推測是地址)

+0

這是一個好主意。我應該提到,我已經寫出正則表達式來隔離電話號碼和括號中的數據。我已更新該帖子以反映這一點。 – alukach

0

據我瞭解你的問題,我認爲你錯誤的方式來解決它。

正則表達式不是一個神奇的工具,它可以從紙漿和雜亂無章的文本元素中提取相關數據。它是一種工具,只能從具有可變部分的文本中提取數據,而且最少的穩定結構作爲可變部分可定位的錨。

在你的治療中,在我看來,你首先隔離了這部分包含可能的電話號碼後面跟着1/2行的地址。但是這樣做,你就失去了信息:以前和以後發生的是錨定信息,你不應該在清除這些信息後得到的剩餘部分中找到某些東西。

此外,我認爲你不想只捕獲一個電話號碼和一個地址:你可能想要提取本節前後的其他信息。有了良好的形狀正則表達式,你可以一次拍攝所有作品。

所以,請給出更多的文字,以及足夠的字符前,有限的部分允許寫一個正確和更容易的正則表達式策略來捕獲所有你想要的數據後足夠的字符。三重已經問過你了,你沒有,爲什麼?

1

這試圖最後兩行隔離出字符串的:

>>> s="""256-555-5555<br/> 
... 1234 Fake Ave S<br/> 
... Gotham (Lower Ward)<br/> 
... """ 
>>> m = re.search(r'((?!</br>).*)<br/>\n((?!</br>).*)<br/>$)', s) 
>>> print m.group(1) 
1234 Fake Ave S 

剪裁括號可能是最好留給的代碼單獨的行,而不是正則表達式進一步複雜化。