问题: 什么是正则表达式,它的主要用途是什么?

👇 点击展开/折叠 面试背诵模板(建议先背这个) 正则表达式是一种由普通字符和元字符组成的模式字符串,用于描述和匹配文本中的字符组合,本质是处理字符串的专用领域语言。其主要用途涵盖四个核心操作:验证(校验数据格式如邮箱、手机号)、提取(从网页日志中抓取目标信息)、替换(批量清洗文本格式)和分割(按规则切分字符串)。正则将复杂的文本处理逻辑浓缩为简短模式,极大提升开发效率。
---

正则表达式的构成与执行逻辑

正则由两种元素构成:字面量字符(如字母 a、数字 3,匹配自身)和元字符(如 .*+?[]()^$|,定义匹配规则)。执行时,引擎从左向右扫描目标字符串,尝试用模式进行匹配,匹配成功则返回结果,失败则回溯尝试其他路径,这一机制称为“回溯”,也是正则性能消耗的主要来源。

四类核心操作详解(Python 实现)

操作类型 核心函数 说明
匹配验证 re.match() / re.fullmatch() 从开头匹配或完全匹配,常用于校验手机号、身份证格式
搜索提取 re.search() / re.findall() 返回第一个匹配对象或所有匹配列表,用于爬虫抓取关键词
替换清洗 re.sub() 将匹配内容替换为新字符串,用于数据脱敏或格式统一
分割切分 re.split() 按正则规则切割字符串,比 str.split() 更灵活(如多空格分割)
1
2
3
4
5
6
7
8
9
import re
# 验证:匹配邮箱
print(re.fullmatch(r'\w+@\w+\.com', 'test@qq.com')) # Match对象
# 提取:抓取数字
print(re.findall(r'\d+', '年龄18, 身高175')) # ['18', '175']
# 替换:脱敏手机号
print(re.sub(r'(\d{3})\d{4}(\d{4})', r'\1****\2', '13812345678')) # 138****5678
# 分割:按标点拆分
print(re.split(r'[,、]', '苹果,香蕉、橙子')) # ['苹果', '香蕉', '橙子']

正则匹配的贪婪与懒惰模式(面试高频)

  • 贪婪匹配(默认):*、+、{m,n} 默认匹配尽可能长的字符串。如 '<.*>' 匹配 <div>text</div> 会返回整个标签而非单个标签。
  • 懒惰匹配(加 ?):*?、+?、{m,n}? 匹配尽可能短的字符串。如 '<.*?>' 匹配 <div>text</div> 会分别返回 <div> 和 </div>。
  • 性能影响:错误的贪婪匹配可能导致大量回溯,甚至引发 ReDoS(正则拒绝服务攻击),建议对复杂正则使用非捕获组 (?:...) 和原子组(部分引擎支持)来优化性能。

Python 正则编译的优势

使用 re.compile() 预编译正则模式,可将模式字符串转化为内部状态机,当多次使用同一正则时(如循环内)大幅提升执行效率,且代码结构更清晰。

1
2
3
pattern = re.compile(r'\d{3}-\d{8}')
result1 = pattern.search('电话: 010-12345678')
result2 = pattern.search('传真: 020-87654321')