01什么是正则表达式,它的主要用途是什么?
文章目录
问题: 什么是正则表达式,它的主要用途是什么?
👇 点击展开/折叠 面试背诵模板(建议先背这个)
正则表达式的构成与执行逻辑
正则由两种元素构成:字面量字符(如字母 a、数字 3,匹配自身)和元字符(如 .*+?[]()^$|,定义匹配规则)。执行时,引擎从左向右扫描目标字符串,尝试用模式进行匹配,匹配成功则返回结果,失败则回溯尝试其他路径,这一机制称为“回溯”,也是正则性能消耗的主要来源。
四类核心操作详解(Python 实现)
| 操作类型 | 核心函数 | 说明 |
|---|---|---|
| 匹配验证 | re.match() / re.fullmatch() |
从开头匹配或完全匹配,常用于校验手机号、身份证格式 |
| 搜索提取 | re.search() / re.findall() |
返回第一个匹配对象或所有匹配列表,用于爬虫抓取关键词 |
| 替换清洗 | re.sub() |
将匹配内容替换为新字符串,用于数据脱敏或格式统一 |
| 分割切分 | re.split() |
按正则规则切割字符串,比 str.split() 更灵活(如多空格分割) |
1 | import re |
正则匹配的贪婪与懒惰模式(面试高频)
- 贪婪匹配(默认):
*、+、{m,n}默认匹配尽可能长的字符串。如'<.*>'匹配<div>text</div>会返回整个标签而非单个标签。 - 懒惰匹配(加
?):*?、+?、{m,n}?匹配尽可能短的字符串。如'<.*?>'匹配<div>text</div>会分别返回<div>和</div>。 - 性能影响:错误的贪婪匹配可能导致大量回溯,甚至引发 ReDoS(正则拒绝服务攻击),建议对复杂正则使用非捕获组
(?:...)和原子组(部分引擎支持)来优化性能。
Python 正则编译的优势
使用 re.compile() 预编译正则模式,可将模式字符串转化为内部状态机,当多次使用同一正则时(如循环内)大幅提升执行效率,且代码结构更清晰。
1 | pattern = re.compile(r'\d{3}-\d{8}') |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LGQ的博客!