MST

星途 面试题库

面试题:Python正则表达式优化与复杂嵌套匹配

在Python中,处理一个复杂的HTML文档,文档中包含多层嵌套的标签,如<div><p><span>content</span></p></div> 。要求通过正则表达式精准提取出所有 <span> 标签内的文本内容,同时要考虑到标签可能存在属性,例如 <span class='test'>content</span> 。请编写一个高效的正则表达式,并给出使用re模块实现提取的代码,同时简要说明你对正则表达式性能优化的思路。
41.6万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

正则表达式

r'<span.*?>(.*?)</span>'

这个正则表达式中,<span.*?> 匹配 <span 开头且包含任意属性的标签起始部分,(.*?) 用于捕获 span 标签内的文本内容,</span> 匹配 span 标签的结束部分。.*? 是非贪婪匹配,以确保精准提取 span 标签内的内容。

使用re模块实现提取的代码

import re


html = "<div><p><span>content</span></p></div><span class='test'>content2</span>"
matches = re.findall(r'<span.*?>(.*?)</span>', html)
for match in matches:
    print(match)

正则表达式性能优化思路

  1. 减少回溯:使用非贪婪模式 .*? 而不是贪婪模式 .*,这样在匹配时会尽快停止,减少不必要的回溯。例如贪婪模式在遇到 <span>text1</span><span>text2</span> 时,可能会先尝试匹配到最后一个 </span>,然后再回溯,而非贪婪模式会直接匹配到最近的 </span>
  2. 预编译正则表达式:使用 re.compile() 方法将正则表达式编译成模式对象,这样在多次使用该正则表达式时,可以提高匹配效率。例如:
import re
pattern = re.compile(r'<span.*?>(.*?)</span>')
html = "<div><p><span>content</span></p></div><span class='test'>content2</span>"
matches = pattern.findall(html)
for match in matches:
    print(match)
  1. 精确匹配:尽量让正则表达式更精确,减少匹配的范围。比如这里明确指定了 <span 标签的开始和结束,避免匹配到其他不相关的标签内容。