正则表达式:如何从字符串末尾匹配指定<p>标签段
反向定位目标
<p>标签的解决方案 遇到这种正向匹配优先捕获靠前内容的问题,反向查找确实是最直接的思路!下面分两种场景(解码前后的字符串)给你具体实现方法:
场景1:先解码HTML实体(推荐,更直观)
你的原始字符串是经过HTML转义的,先把它解码成正常的HTML结构会更容易处理:
import html # 原始转义字符串 original_str = "TEXT <p>TEST1</p><br><div>&nbsp;<p>TEST2</p></div>" # 解码HTML实体 decoded_str = html.unescape(original_str)
解码后得到:TEXT <p>TEST1</p><br><div> <p>TEST2</p></div>
接下来用**反向查找(rfind)**精准定位:
- 先找到结尾的
</p></div>的位置 - 从该位置往前找最近的
<p>标签 - 验证这段内容包含
TEST2后提取
代码实现:
end_tag = "</p></div>" end_pos = decoded_str.rfind(end_tag) if end_pos != -1: # 从结尾标签往前找第一个<p>的起始位置 start_pos = decoded_str.rfind("<p>", 0, end_pos) if start_pos != -1 and "TEST2" in decoded_str[start_pos:end_pos + len(end_tag)]: target_content = decoded_str[start_pos:end_pos + len(end_tag)] print(target_content) # 输出:<p>TEST2</p></div>
场景2:直接处理转义后的原始字符串
如果不想解码,也可以针对转义后的标签字符写正则,用贪婪匹配+捕获组直接提取最后一段符合条件的内容:
正则表达式(匹配转义后的<p>TEST2</p></div>):
.*(<p>TEST2</p></div>)
解释:
.*贪婪匹配所有前面的内容(确保我们拿到最后出现的目标片段)- 捕获组
(<p>TEST2</p></div>)就是我们要的完整标签内容
Python代码实现:
import re original_str = "TEXT <p>TEST1</p><br><div>&nbsp;<p>TEST2</p></div>" pattern = r".*(<p>TEST2</p></div>)" match = re.search(pattern, original_str) if match: print(match.group(1)) # 输出:<p>TEST2</p></div>
核心思路总结
- 反向查找(
rfind):从目标结尾标签出发,向前扫描找到最近的起始标签,避免正向匹配的优先捕获问题 - 贪婪正则:通过
.*吃掉所有前面的内容,只保留最后一个符合条件的目标片段,精准捕获你要的TEST2对应的标签组
内容的提问来源于stack exchange,提问作者Yu Mad
相关产品推荐
相关产品推荐

