使用正则表达式删除所选文本

时间:2013-12-11 02:37:21

标签: python html regex python-2.7

我有一个大的html块,我想删除所有<img>个元素,但不是它们的文本部分。所以也许有这样的事情:

<a href="http:">Some text</a> Some other text <img height="1" picture.gif> MORE TEXT </img>

如果我使用BeautifulSoup来提取所有img标签,我也会丢失相关文本(上例中的“MORE TEXT”)。所以我决定在制作汤之前在整个html上使用正则表达式。我想通过下一个"<img"删除每个">",然后每隔"</img>"删除一次while myhtml.find('<img/') > 0: re.sub( r'<img .*?>', '', myhtml , flags=re.DOTALL) re.sub( r'</img>', '', myhtml , flags=re.DOTALL) 。这应该留下文字。

所以这是我的尝试:

{{1}}

我跑了这个,所有的img部分仍在那里。不知道下一步该尝试什么。

2 个答案:

答案 0 :(得分:1)

  

我有一个大的html块,我想删除所有<img>个元素,但不删除它们的文本部分。

你可以避免在这里使用正则表达式。

>>> from BeautifulSoup import BeautifulSoup                                                                                                                            
>>> html = '<a href="http:">Some text</a> Some other text <img height="1" picture.gif> MORE TEXT </img>'
>>> soup = BeautifulSoup(html)
>>> for m in soup.findAll('img'):
>>>     m.replaceWithChildren()

>>> print soup

<a href="http:">Some text</a> Some other text  MORE TEXT 

如果您仍然喜欢使用正则表达式,只想删除所有<img ..></img>标记:

re.sub(r'</?img[^>]*>', '', html)

答案 1 :(得分:1)

您可以使用以下正则表达式匹配<img>元素:

(?<!(<[^>]*))(</?img[^>]*>)

正则表达式的第一部分(?<!(<[^>]*))断言负{@ 1}}元素不在另一个开放标记元素中。这应该考虑诸如标签出现在字符串中的情况。

正则表达式的第二部分<img>(</?img[^>]*>)<img...>标记元素匹配。