正则替换日期需先精准匹配再分组重构:数字日期用(\d{4})-(\d{1,2})-(\d{1,2})捕获,反向引用转格式;中文日期加\b或(?

用正则替换特定日期格式,关键是先准确匹配目标模式,再用分组+反向引用或函数动态生成新格式。Python 的 re.sub() 是核心工具,不需要额外安装库。
匹配并替换标准数字日期(如 YYYY-MM-DD)
这类格式规律强、分隔符固定,适合用捕获分组直接复用:
- 写法:用
(\d{4})-(\d{2})-(\d{2})匹配年、月、日三部分 - 替换时用
r'\3/\2/\1'就能转成DD/MM/YYYY,用r'\1年\2月\3日'就变成中文格式 - 注意:
\d{2}要求两位数,若原始数据有2023-1-5这类单数月/日,应改用\d{1,2}
处理中文日期(如 “8月19日”“2023年12月31日”)
中文日期没有固定位数,且常夹杂在其他文字中,需兼顾边界和灵活性:
- 简单去除非独立日期:直接用
r'\d{1,2}月\d{1,2}日'替换为空,但可能误删“第12月31日”中的“12月31日” - 更稳妥加边界限定:用
r'(?,确保前后不是数字(避免匹配到“2023年12月31日”里的“12月31日”被截断) - 若要保留空格或标点,替换后可接
.replace(' ', ' ').strip()清理多余空白
用函数实现动态替换(比如转为星期几或相对日期)
当替换逻辑超出字符串拼接范围,比如把“10月5日”替换成“星期日”,就得用函数作为 repl 参数:
- 定义函数接收
Match对象,从中取.group(1)(月)、.group(2)(日),补全年份后构造datetime实例 - 返回格式化后的字符串,例如
dt.strftime('%A')得到“Sunday” - 调用时写
re.sub(pattern, your_func, text),不要加括号,否则会立即执行
常见坑与应对
实际替换容易出错的几个点:
- 忘记加原始字符串前缀
r'',导致\1被当成 ASCII 字符而非反向引用 - 未考虑大小写或空格干扰,比如“8月19日”前面是换行或句号,可用
re.DOTALL或re.IGNORECASE标志辅助 - 替换后出现多余空格或顿号,建议替换完统一做一次
re.sub(r'\s+', ' ', s).strip()











