Windows文件名需用白名单正则r'1'清洗,保留字母数字、点、下划线、短横线,再strip首尾空格/点/下划线/短横线,空名fallback为'unnamed',并预编译正则、避免重命名冲突。a-zA-Z0-9._- ↩

re.sub 里用 r'[:"/\|?*]' 才能真正覆盖 Windows 全部非法字符
很多脚本只写 r'[/*?:"|]',漏掉 、<code>>、,结果 rename 时仍报 OSError: [WinError 123]。Windows 实际禁止的字符是这 9 个:、<code>>、:、"、/、、|、?、*,正则必须全包含,且 和 / 都要转义——所以模式得写成 r'[:"/\|?*]'。
别信 re.escape('string'):它适合拼接动态字符,但静态列表手写正则更准、更快、无歧义。控制字符(