正则表达式在Python中将<div> <img ...=""/> </div>转换为<div> <img ...=""/> </div>

时间:2014-12-26 13:33:47

标签: python regex python-3.x

我试图在其他HTML中间关闭图像标记,因为当我使用JS创建它,然后将其发送给自己时,它没有正确关闭。我正在使用Python。

鉴于此字符串:

<div><img src="/images/someImage.png" alt="Some Image"></div>

我怎样才能获得

<div><img src="/images/someImage.png" alt="Some Image" /></div>

这是我到目前为止所提出的:

re.sub("<img(.*)(?<!/)>", "<img\\1 />", x)

只有图片,它才有效,但是一旦我添加了div来围绕它,就会把它放在错误的位置:

<div><img src="http://sh.local/images/tripAlbums/2014/thumbs/Background%20Default.jpeg"></div />

正如您所注意到的那样,结尾的DIV在图像标签上有我想要的东西。

请注意,虽然我只展示了一张图片,但可能会有更多图片,因此它应该与全局re.sub配合使用。

感谢。

3 个答案:

答案 0 :(得分:2)

使用非贪婪的.*?

>>> re.sub("<img(.*?)(?<!/)>", "<img\\1 />", str)
'<div><img src="/images/someImage.png" alt="Some Image" /></div>'

您也可以尝试

>>> re.sub("<img([^>]*)(?<!/)>", "<img\\1 />", str)
'<div><img src="/images/someImage.png" alt="Some Image"/></div>'
  • [^>]*否定字符类。匹配除> 零或更多
  • 以外的任何内容



清洁方法

更清洁,更美观的方法将使用BeautifulSoup

>>> import bs4
>>> str='<div><img src="/images/someImage.png" alt="Some Image"></div>'
>>> soup = bs4.BeautifulSoup(str)
>>> soup.prettify()
u'<div>\n <img alt="Some Image" src="/images/someImage.png"/>\n</div>'

注意正则表达式不是解析html的正确工具。建议使用像BeautifulSoup

这样的html解析器

答案 1 :(得分:1)

BeautifulSoup会自动为您完成这项工作。

>>> from bs4 import BeautifulSoup
>>> s = '''<div><img src="/images/someImage.png" alt="Some Image"></div>'''
>>> soup = BeautifulSoup(s)
>>> soup
<html><body><div><img alt="Some Image" src="/images/someImage.png"/></div></body></html>

答案 2 :(得分:0)

s='<div><img src="/images/someImage.png" alt="Some Image"></div>'
n=s.find('<img')
result=s[:n+1]
s=s[n+2:]
n=s.find('>')
result=result+s[:n]+" / "+s[n:]
print result