首页 > 解决方案 > 正则表达式如何将带有内容的多余 html 标签替换为一个标签

问题描述

我正在尝试在 Python 中创建一个删除 html 标签重复项的正则表达式。

我尝试对组进行此操作,但失败了:

正则表达式:

<strong>(.*)<\/strong><strong>(.*)<\/strong>

Python代码:

description = re.sub(r"<strong>(.*)<\/strong><strong>(.*)<\/strong>", r"<strong>\1\2</strong>", description, flags=re.IGNORECASE)

这里有一些例子:

IN: text1 <strong>text2 </strong><strong>text3 </strong><strong>text4,</strong> text5
OUT: text1 <strong>text2 text3 text4,</strong> text5

IN: text1 <strong>text2 </strong> HELLO <strong>text3 </strong><strong>text4,</strong> text5
OUT: text1 <strong>text2 </strong> HELLO <strong>text3 text4,</strong> text5
 
IN: <strong> hello <strong>world</strong></strong>
OUT: <strong> hello world</strong>

标签: pythonhtmlregex

解决方案


您好,欢迎来到 StackOverflow!

您可以从另一个角度看待您的问题:您可以保留第一个开始标签和最后一个结束标签,而不是捕获标签的内容。可以通过以下方式删除中间的关闭和打开标签:

import re
mytext = 'text1 <strong>text2 </strong> HELLO <strong>text3 </strong><strong>text4,</strong> text5'
re.subs('<\/strong>\s*<strong>', '', mytext)

这将导致:

text1 <strong>text2 </strong> HELLO <strong>text3 text4,</strong> text5

请注意,\s*需要考虑标签之间的任何空格或换行符。

您还可以使用反向引用修改正则表达式以推广到所有 HTML5 标记:

merge_duplicated = re.compile(r'<\/(\w+)>\s*<\1>')

推荐阅读