如何按指定HTML标签分割字符串并保留标签?
保留HTML标签的字符串分割方案
问题场景
我需要按指定HTML标签(<li>、<ul>、<ol>、<dl>、<dt>、<dd>、<h1>至<h6>)分割字符串,最初写了正则表达式:
pattern = '<li>|<ul>|<ol>|<dl>|<dt>|<dd>|<h1>|<h2>|<h3>|<h4>|<h5>|<h6>'
用re.split处理后,虽然能完成分割,但丢失了起始标签,测试示例如下:
import re test_string = '<p> Some text some text some text. </p> <p> Another text another text </p>. <li> some list </li>. <ul> another list </ul>' res = re.split(pattern, test_string) print(res) # 输出: # ['<p> Some text some text some text. </p> <p> Another text another text </p>. ', ' some list </li>. ', ' another list </ul>']
我期望分割后起始标签能和对应内容保留在同一个元素里,得到如下结果:
['<p> Some text some text some text. </p> <p> Another text another text </p>. ', '<li> some list </li>. ', '<ul> another list </ul>']
解决方案
核心思路是用正则捕获组保留分割时的标签,再将标签与后续内容合并:
- 修改正则表达式,添加捕获组
把每个标签匹配项放在括号()中,这样re.split会将捕获到的标签作为独立元素保留在结果里:
pattern = r'(<li>|<ul>|<ol>|<dl>|<dt>|<dd>|<h1>|<h2>|<h3>|<h4>|<h5>|<h6>)'
- 执行分割,得到包含标签的中间结果
split_result = re.split(pattern, test_string) print(split_result) # 输出: # ['<p> Some text some text some text. </p> <p> Another text another text </p>. ', '<li>', ' some list </li>. ', '<ul>', ' another list </ul>']
- 合并标签与对应内容
遍历分割结果,将相邻的标签元素和内容元素拼接,同时过滤空字符串:
final_result = [] i = 0 while i < len(split_result): if split_result[i]: # 判断当前元素是否为标签,若是则和下一个内容元素合并 if i + 1 < len(split_result) and split_result[i].startswith('<'): final_result.append(split_result[i] + split_result[i+1]) i += 2 else: final_result.append(split_result[i]) i += 1 print(final_result) # 输出符合预期的结果: # ['<p> Some text some text some text. </p> <p> Another text another text </p>. ', '<li> some list </li>. ', '<ul> another list </ul>']
也可以用更简洁的切片+列表推导式实现合并:
final_result = [] # 处理第一个非标签内容块 if split_result[0]: final_result.append(split_result[0]) # 成对处理标签和内容 for tag, content in zip(split_result[1::2], split_result[2::2]): final_result.append(tag + content)
内容的提问来源于stack exchange,提问作者Alex Nikitin
相关产品推荐
相关产品推荐

