我写过以下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 :(得分: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())