通配符 | 含义 | 爬虫示例 | 示例含义 |
|---|---|---|---|
. | 匹配除换行符外的任意单个字符 | “re.findall(r’href=”“(.*?)”“', html)” | 提取HTML标签属性值 |
\d | 匹配任意数字(等价于[0-9]) | “re.search(r’id-(\d+)’ , url)” | 提取URL中的数字ID |
\w | 匹配字母、数字、下划线(等价于[a-zA-Z0-9_]) | “re.findall(r’class=”“(\w+)”“’ , html)” | 提取CSS类名 |
\s | 匹配空白字符(空格、制表符、换行等) | “re.sub(r’\s+’ , ’ ’ , html)” | 清理多余空白字符 |
\S | 匹配非空白字符 | “re.findall(r’username=(\S+)', url)” | 提取URL参数中的非空值 |
\D | 匹配非数字字符 | “re.search(r’page-(\D+)', url)” | 提取URL中的非数字标识 |
\b | 单词边界 | “re.findall(r’\berror\b’, log)” | 精确匹配完整单词 |
.* | 贪婪匹配:匹配任意数量字符(除换行符) | “re.search(r’.*', html)” | 匹配大段HTML内容(可能跨标签,慎用) |
.*? | 非贪婪匹配:匹配最少可能字符 | “re.findall(r’(.*?)', html)” | 最常用:精确提取段落内容 |
+ | 前一个字符出现1次或多次 | “re.findall(r’\d+', text)” | 提取连续数字(如价格、ID) |
* | 前一个字符出现0次或多次 | “re.sub(r’’ , ‘’ , html)” | 移除脚本标签(配合非贪婪) |
? | 前一个字符出现0次或1次 | “re.search(r’https?’ , url)” | 匹配http或https协议 |
^ | 匹配字符串开头 | “re.match(r’^https://’ , url)” | 验证URL协议类型 |
$ | 匹配字符串结尾 | “re.search(r’.html$’ , url)” | 检查URL是否为HTML页面 |
[abc] | 匹配括号内任意一个字符 | “re.findall(r’[A-Z][a-z]+', text)” | 提取英文单词(首字母大写) |
[^abc] | 匹配不在括号内的任意字符 | “re.search(r’[^.]+’ , domain)” | 提取域名主干(不含后缀) |
(a,b) | 匹配a或b | “re.findall(r’png,jpg’ , img_url)” | 检查图片格式 |
{n} | 前一个字符出现n次 | “re.search(r’\d{4}-\d{2}’ , date)” | 匹配日期格式(如2023-10) |
“{n, }” | 前一个字符出现至少n次 | “re.findall(r’\d{4 , }’ , year)” | 匹配4位以上年份 |
\ | 转义字符:将特殊字符转为普通字符 | “re.search(r’https://’ , url)” | 匹配实际的斜杠/符号 |
(?=…) | 正向先行断言:匹配…前面的内容 | “re.findall(r’price:\d+(?=$)', text)” | 提取带货币符号的价格数字 |
(?!..) | 负向先行断言:不匹配…前面的内容 | “re.findall(r’\d+(?!$)’ ,text)” | 提取不带货币符号的数字 |
注意事项
# 错误:贪婪匹配会匹配到最后一个</div>
re.search(r'<div>.*</div>', html)
# 正确:非贪婪匹配到第一个</div>
re.search(r'<div>.*?</div>', html)2. 原始字符串r前缀:所有正则表达式推荐使用r’…'格式
# 正确
re.sub(r'<.*?>', '', html)
# 错误(反斜杠会被转义)
re.sub('<.*?>', '', html)