正则表达式(Regular Expression)是一种强大的文本处理工具,几乎在所有需要文本处理的场景中都能发挥作用。尤其是在爬虫或知识库项目中经常会用到正则表达式来清洗整理文本,本文介绍了常用的正则表达式及语法。
一、正则表达式使用说明
1. 正则表达式简介
正则表达式(Regular Expression)是用一个字符串来描述特定特征,用于验证、查找或替换其他字符串的强大工具。它可以:
验证字符串是否符合指定特征(如验证电子邮件地址)
查找符合特定特征的字符串(比固定字符串查找更灵活)
进行复杂的文本替换操作
2. 基本语法规则
2.1 普通字符
字母、数字、汉字、下划线及未特殊定义的标点符号都是普通字符,匹配与之相同的字符。
示例:
表达式 "c" 匹配 "abcde" 中的 "c"
表达式 "bcd" 匹配 "abcde" 中的 "bcd"
2.2 转义字符
不便书写的字符可使用转义字符:
表达式 可匹配 \r, \n 回车和换行符 \t 制表符 \ ""本身 ^ ^符号本身 符号本身 . 小数点(.)本身 示例:
表达式 "d"匹配"abcd"匹配"abcde" 中的 "$d"
2.3 匹配多种字符的表达式
表达式 可匹配 \d 任意一个数字(0-9) \w 任意字母、数字或下划线(A-Z,a-z,0-9,_) \s 任意空白字符(空格、制表符、换页符等) . 除换行符(\n)外的任意字符 示例:
"\d\d" 匹配 "abc123" 中的 "12"
"a.\d" 匹配 "aaa100" 中的 "aa1"
2.4 自定义匹配字符集
使用方括号定义匹配字符集:
表达式 可匹配 [ab5@] 匹配"a"、"b"、"5"或"@" [^abc] 匹配除"a","b","c"外的任意字符 [f-k] 匹配"f"到"k"之间的任意字母 [^A-F0-3] 匹配"A"-"F","0"-"3"之外的任意字符 示例:
"[bcd][bcd]" 匹配 "abc123" 中的 "bc"
"[^abc]" 匹配 "abc123" 中的 "1"
2.5 匹配次数修饰符
表达式 作用 {n} 表达式重复n次 {m,n} 表达式至少m次,最多n次 {m,} 表达式至少m次 ? 0次或1次,相当于{0,1}
- 至少1次,相当于{1,}
- 0次或任意次,相当于{0,} 示例:
"\d+.?\d*" 匹配 "It costs $12.5" 中的 "12.5"
"go{2,8}gle" 匹配 "Ads by goooooogle" 中的 "goooooogle"
2.6 位置匹配符
表达式 作用 ^ 匹配字符串开始位置 $ 匹配字符串结束位置 \b 匹配单词边界 示例:
"^aaa" 只匹配开头为"aaa"的字符串
"aaa$" 只匹配结尾为"aaa"的字符串
"\bend\b" 匹配"weekend,endfor,end"中的独立单词"end"
2.7 分组与或操作
表达式 作用 左右两边表达式"或"关系 ( ) 1. 作为整体被修饰 2. 可单独获取匹配内容 示例:
"Tom|Jack" 匹配"I'm Tom, he is Jack"中的"Tom"和"Jack"
"(go\s*)+" 匹配"Let's go go go!"中的"go go go"
"¥(\d+.?\d*)" 匹配"$10.9,¥20.5"中的"¥20.5"并提取"20.5"
3. 高级规则
3.1 贪婪与非贪婪模式
贪婪模式:默认情况,尽可能多匹配(如".*")
非贪婪模式:在次数修饰符后加"?",尽可能少匹配(如".*?")
示例:
"(.*)" 会匹配到最后一个
"(.*?)" 会逐个匹配...对
3.2 反向引用
使用"\1", "\2"等引用前面括号匹配的内容。
示例:
"(\w)\1{4,}" 匹配连续5个以上相同字符如"ccccc"
"<(\w+)\s(\w+(=('|").?\4)?\s)>.*?</\1>" 匹配成对的HTML标签
3.3 预搜索
不消耗字符的位置判断:
表达式 作用 (?=xxxxx) 右侧必须能匹配xxxxx (?!xxxxx) 右侧必须不能匹配xxxxx (?<=xxxxx) 左侧必须能匹配xxxxx (?<!xxxxx) 左侧必须不能匹配xxxxx 示例:
"Windows (?=NT|XP)" 只匹配后面是NT或XP的"Windows "
"(?<=\d{4})\d+(?=\d{4})" 匹配前后各4位数字的中间部分
4. 实用技巧
完全匹配:用"^...$"确保整个字符串匹配
如"^\d+$"匹配纯数字字符串
完整单词匹配:用"\b...\b"确保匹配完整单词
如"\b(if|while|else)\b"匹配关键字
避免空匹配:不要使用可以匹配空字符串的表达式
错误:"\d.?\d"(可能匹配空字符串)
正确:"\d+.?\d*|.\d+"
常用正则示例:
邮箱:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$
URL:^[a-zA-z]+://(\w+(-\w+))(.(\w+(-\w+)))(?\S)?$
中文:[\u4e00-\u9fa5]
HTML标签:<(.)>.</\1>|<(.*)/>
5. 在编程中使用
不同语言的正则表达式实现略有差异,但基本语法相同。例如在Java中:
import java.util.regex.*; // 编译正则表达式 Pattern pattern = Pattern.compile("\\d+"); // 创建匹配器 Matcher matcher = pattern.matcher("abc123"); // 查找匹配 if(matcher.find()) { System.out.println("找到数字: " + matcher.group()); }
6. 工具推荐
Regex Match Tracer:可视化正则表达式测试工具
在线测试工具:如regex101.com、regexr.com
正则表达式调试器:帮助理解和调试复杂表达式
7. 注意事项
性能考虑:复杂正则可能导致性能问题,特别是回溯过多时
可读性:过于复杂的正则表达式难以维护,可考虑分步处理
特殊字符转义:注意在不同编程语言中的转义要求
二、正则表达式使用场景详解
正则表达式(Regular Expression)是一种强大的文本处理工具,几乎在所有需要文本处理的场景中都能发挥作用。以下是正则表达式的主要使用场景分类和具体应用示例:
1. 数据验证场景
1.1. 表单输入验证
邮箱验证:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$
手机号验证:^1[3-9]\d{9}$ (中国大陆手机号)
身份证验证:^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$
密码强度验证:^(?=.[A-Z])(?=.[a-z])(?=.\d)(?=.[!@# (至少8位,含大小写字母、数字和特殊字符)
1.2. 数据格式验证
日期格式:^\d{4}-\d{2}-\d{2}$ (YYYY-MM-DD)
时间格式:^([01]\d|2[0-3]):[0-5]\d(:[0-5]\d)?$ (HH:MM 或 HH:MM:SS)
IP地址验证:^((25[0-5]|2[0-4]\d|[01]?\d\d?).){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$
URL验证:^(https?|ftp)://[^\s/.?#].[^\s]*.?#].[^\s]*
2. 数据提取场景
2.1. 日志分析
提取日志中的IP:\b\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}\b
提取时间戳:[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}]
提取错误代码:ERROR\s+\d+
2.2. 网页内容抓取
提取HTML标签内容:
提取所有链接:<a\s+(?:[^>]?\s+)?href="([^"])"
提取图片路径:<img[^>]+src="([^"]+)"
2.3. 文档处理
提取Markdown标题:^#+\s+(.+)$
提取代码中的注释://.?$|/\.?\/ (单行和多行注释)
提取CSV特定列:^([^,]),([^,]),([^,]*)$ (提取前3列)
3. 数据清洗与转换
3.1. 文本替换
去除HTML标签:<[^>]+>
去除多余空格:\s+ → 替换为单个空格
格式化电话号码:(\d{3})(\d{4})(\d{4}) → 1−1−2-$3
3.2. 数据标准化
日期格式转换:(\d{4})/(\d{2})/(\d{2}) → 2−2−3-$1 (YYYY/MM/DD → MM-DD-YYYY)
金额格式化:(\d)(?=(\d{3})+(?!\d)) → $1, (添加千位分隔符)
3.3. 敏感信息处理
隐藏手机号中间四位:(\d{3})\d{4}(\d{4}) → 1∗∗∗∗1∗∗∗∗2
隐藏邮箱部分内容:(\w{2})[\w@]+(\w{2}@\w+.\w+) → 1∗∗∗1∗∗∗2
4. 开发辅助场景
4.1. 代码搜索与重构
查找所有console.log:console.log(.*?);
查找未使用的变量:const\s+(\w+)\s=\s.*?(?=\n|;) (结合代码分析工具)
批量重命名函数:function\s+oldName( → function newName(
4.2. 配置文件处理
提取环境变量:^\s([A-Z_]+)\s=\s(.?)\s*$
修改配置项:(server.port\s=\s)\d+ → $18080
4.3. 数据库操作
SQL查询条件构造:动态生成WHERE子句
数据导出过滤:筛选符合特定模式的数据记录
5. 系统管理场景
5.1. 日志监控
检测错误日志:(ERROR|FATAL|CRITICAL).*
检测异常登录:Failed\s+password\s+for\s+\w+
5.2. 文件批量处理
批量重命名文件:匹配特定命名模式并替换
查找特定类型文件:.*.(jpg|png|gif)$
5.3. 网络管理
过滤网络数据包:特定IP或端口模式
分析访问日志:统计特定URL的访问量
6. 特殊领域应用
6.1. 自然语言处理
分词处理:匹配特定语言的分词规则
实体识别:识别日期、人名、地名等
6.2. 生物信息学
DNA序列匹配:特定基因序列模式
蛋白质序列分析:氨基酸模式识别
6.3. 金融数据分析
提取交易金额:$(\d+(?:,\d{3})*(?:.\d{2})?)
识别股票代码:[A-Z]{2,4}\b (特定交易所规则)
7. 编程语言中的实现差异
虽然正则表达式语法基本一致,但不同语言实现有细微差别:
语言/工具 特点 JavaScript 使用/pattern/flags语法,支持exec()、test()等方法 Python 通过re模块,功能全面,支持命名分组 Java java.util.regex包,需要双重转义 PHP preg_系列函数,兼容Perl风格 grep/sed 命令行工具,常用于文本处理 IDE/编辑器 支持正则搜索替换,语法可能有差异
8. 性能优化建议
避免回溯爆炸:谨慎使用.*和嵌套量词
使用非贪婪匹配:在适当场景使用.?代替.
预编译正则表达式:在多次使用时预编译模式
使用具体字符集:[a-z]比.更高效
合理使用锚点:^和$可以显著提高性能
9.学习资源推荐
在线测试工具:
Regex101 regex101: build, test, and debug regex
RegExr https://regexr.com/
可视化工具:
Regexper (正则表达式可视化) Regexper
Debuggex Debuggex: Online visual regex tester. JavaScript, Python, and PCRE.