面试题答案
一键面试正则表达式
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)
正则表达式性能优化思路
- 减少回溯:使用非贪婪模式
.*?
而不是贪婪模式.*
,这样在匹配时会尽快停止,减少不必要的回溯。例如贪婪模式在遇到<span>text1</span><span>text2</span>
时,可能会先尝试匹配到最后一个</span>
,然后再回溯,而非贪婪模式会直接匹配到最近的</span>
。 - 预编译正则表达式:使用
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)
- 精确匹配:尽量让正则表达式更精确,减少匹配的范围。比如这里明确指定了
<span
标签的开始和结束,避免匹配到其他不相关的标签内容。