2011-11-17 61 views
1

我已經寫了下面的regex但它不工作。你能幫我麼?謝謝:-)提取藝術家和音樂文本(正則表達式)

track_desc = '''<img src="http://images.raaga.com/catalog/cd/A/A0000102.jpg" align="right" border="0" width="100" height="100" vspace="4" hspace="4" /> 
      <p> 
      </p> 
      <p> Artist(s) David: <br/> 
       Music: Ramana Gogula<br/> 
      </p>''' 
rx = "<p><\/p><p>Artist\(s\): (.*?)<br\/>Music: (.*?)<br\/><\/p>" 
m = re.search(rx, track_desc) 

輸出應該是:

Artist(s) David 
Music: Ramana Gogula 
+0

嚴重傾向於替代正則表達式。 – FailedDev

+0

強制性引用在這裏:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – bgporter

+0

我想這樣格式不好的HTML,甚至解析器不會對你有太大的幫助,儘管你至少可以用它來從HTML中提取文本。 – Acorn

回答

1

你被忽略的空白:

<p>[\s\n\r]*Artist\(s\)[\s\n\r]*(.*?)[\s\n\r]*:[\s\n\r]*<br/>[\s\n\r]*Music:[\s\n\r]*(.*?)<br/>[\s\n\r]*</p> 

輸出是:

[1] => "David" 
[2] => "Ramana Gogula" 

(請注意,您的正則表達式不匹配Artists(s)Music:前綴要麼)


然而生產代碼我不會依賴這樣而笨拙正則表達式(和同樣笨拙地格式化的HTML源)。

雖然嚴重,溝使用此正則表達式的想法,如果你沒有絲毫熟悉的正則表達式(它看起來像)。您正在使用錯誤的工具和格式不正確的數據源。與正則表達式解析HTML是錯誤的9個10例(見@ bgporter的評論鏈接),註定要失敗。除此之外,HTML是幾乎沒有一個合適的數據源(除非真的是無可奈何源)。

+0

一個大問題是,他試圖匹配'藝術家(s):大衛',而他的來源有文字'藝術家(s)大衛:'... –

+0

@Regexident謝謝但它顯示這樣的東西。 '<_sre.SRE_Match對象在0x01FFD4E8>' – Kulbir

+0

@CodeJockey:是的,絕對。 – Regexident

0

我看到幾個錯誤:

  • 正則表達式是不是多:應該使用flags=re.MULTILINE允許匹配多線
  • 空間沒有考慮到
  • 藝術家(S)不跟:

由於網頁是相當奇怪的呈現,這可能是錯誤傾向於依賴於正則表達式,我不會建議廣泛使用它。

注意,以下似乎工作:

rx='Artist(?:\(s\))?\s+(.*?)\<br\/>\s+Music:\s*(.*?)\<br' 
print ("Art... : %s && Mus... : %s" % re.search(rx, track_desc,flags=re.MULTILINE).groups()) 
1
import lxml.html as lh 
import re 

track_desc = ''' 
<img src="http://images.raaga.com/catalog/cd/A/A0000102.jpg" align="right" border="0" width="100" height="100" vspace="4" hspace="4" /> 
<p> 
</p> 
<p> Artist(s) David: <br/> 
Music: Ramana Gogula<br/> 
</p> 
''' 

tree = lh.fromstring(track_desc) 

print re.findall(r'Artist\(s\) (.+):\s*\nMusic: (.*\w)', tree.text_content())