如何用Python将<strong><em><u>标签统一替换为<strong>?需两种实现方案
实现方案
方案1:不使用正则(基于HTML解析器实现)
该方案通过解析HTML的DOM结构处理标签,完全避免字符串误匹配问题,不管标签嵌套层数、嵌套顺序多复杂都能准确处理,是最严谨的实现方式,还能自动兼容目标标签带属性的场景。
from html.parser import HTMLParser class StrongReplaceParser(HTMLParser): def __init__(self): super().__init__() self.result = [] self.target_tags = {'strong', 'em', 'u'} def handle_starttag(self, tag, attrs): if tag in self.target_tags: self.result.append('<strong>') else: attr_str = ' '.join(f'{k}="{v}"' for k, v in attrs) self.result.append(f'<{tag} {attr_str}>' if attr_str else f'<{tag}>') def handle_endtag(self, tag): if tag in self.target_tags: self.result.append('</strong>') else: self.result.append(f'</{tag}>') def handle_data(self, data): self.result.append(data) def function_cover_all_strong(html): parser = StrongReplaceParser() parser.feed(html) return ''.join(parser.result) # 测试用例 html = ''' <h1>Make bakery</h1> <p>Step 1: Please use good quality product for make <strong><em>bakery</em></strong></p> <p>Step 2: Make <em><u>bakery</u></em> hot</p> <p>Step 2: Make <em><strong><u>bakery</u></strong></em> hot</p> ''' print(function_cover_all_strong(html))
如果你的输入是已经转义为</>的内容,可以先把实体转回原始字符再处理,或者直接修改解析逻辑适配转义格式。
方案2:使用正则实现
该方案代码更简洁,适合确定输入HTML中没有非标签场景的<xxx>格式内容的情况,仅需两行正则替换就能覆盖所有嵌套场景,无需枚举任何排列组合。
import re def function_cover_all_strong(html): # 替换所有目标开标签为<strong>,兼容标签带空格、带属性的场景 html = re.sub(r'<\s*(strong|em|u)\s*[^>]*>', '<strong>', html) # 替换所有目标闭标签为</strong> html = re.sub(r'<\s*/\s*(strong|em|u)\s*>', '</strong>', html) return html # 测试用例同上 html = ''' <h1>Make bakery</h1> <p>Step 1: Please use good quality product for make <strong><em>bakery</em></strong></p> <p>Step 2: Make <em><u>bakery</u></em> hot</p> <p>Step 2: Make <em><strong><u>bakery</u></strong></em> hot</p> ''' print(function_cover_all_strong(html))
如果需要处理转义后的实体内容,把正则里的<替换为<、>替换为>即可:
html = re.sub(r'<\s*(strong|em|u)\s*[^&]*>', '<strong>', html) html = re.sub(r'<\s*/\s*(strong|em|u)\s*>', '</strong>', html)
内容的提问来源于stack exchange,提问作者nguyenphanhoaiduc
相关产品推荐
相关产品推荐

