从文本(正则表达式)中提取艺术家和音乐

时间:2011-11-17 15:11:09

标签: python regex

我写过以下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

3 个答案:

答案 0 :(得分: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在10个案例中有9个是错误的(请参阅@ bgporter的评论链接)并且注定要失败。除此之外,HTML几乎不是一个合适的数据源(除非真的没有其他来源)。

答案 1 :(得分: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())

答案 2 :(得分:0)

我看到一些错误:

  • 正则表达式不是多行的:应该使用flags=re.MULTILINE来允许在多行上匹配
  • 不考虑空格
  • 艺术家未跟:

由于网页呈现得相当奇怪,这可能容易依赖正则表达式,我不建议广泛使用它。

注意,以下似乎有效:

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