You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python文件名清理:保留扩展名,将特殊字符与空格替换为连字符

如何在Python中移除特殊字符和空格并替换为连字符,同时保留文件扩展名?

当然可以!你的需求很清晰:把文件名里的特殊字符、空格换成连字符,但要保留末尾的文件扩展名(比如.mp4、.mov这类)。你当前的方法虽然能工作,但确实不够灵活——每次新增一个扩展名就得加个replace,太麻烦了。

给你两个更优的解决方案,都能完美解决你的问题:

方法一:拆分文件名和扩展名再处理(直观易维护)

这个思路是先把文件名和扩展名分开,只处理文件名部分,最后再拼回去,不管是什么扩展名都能适配:

import os
import re

def clean_filename(filename):
    # 用os.path.splitext拆分文件名和扩展名,比如你的例子会拆成('Special $#! characters spaces_ 888323', '.mp4')
    name_part, ext_part = os.path.splitext(filename)
    # 把文件名里的所有非单词字符(除了下划线)替换成连字符,多个连续的会合并成一个
    cleaned_name = re.sub(r'[^\w]+', '-', name_part)
    # 拼接处理后的文件名和原扩展名
    return f"{cleaned_name}{ext_part}" if ext_part else cleaned_name

# 测试你的例子
test_string = 'Special $#! characters spaces_ 888323.mp4'
print(clean_filename(test_string))  # 输出: Special-characters-spaces_-888323.mp4

这个方法的好处是逻辑清晰,哪怕你以后要处理新的扩展名(比如.pdf、.jpg),完全不用改代码,直接用就行。

方法二:用正则一步到位(简洁高效)

如果你喜欢用正则一次性处理整个字符串,可以用负向预查来避开扩展名部分,不用拆分:

import re

def clean_filename(filename):
    # 正则解释:
    # [^\w.]+ 匹配所有非单词字符、非点的字符(也就是你要替换的特殊字符和空格)
    # (?![^.]*$) 负向预查,确保匹配的内容不在扩展名里(后面不会跟着“没有点的内容直到结尾”)
    return re.sub(r'[^\w.]+(?![^.]*$)', '-', filename)

# 测试同样有效
test_string = 'Special $#! characters spaces_ 888323.mp4'
print(clean_filename(test_string))  # 输出同样符合预期

这个方法代码更短,正则稍微有点复杂,但理解之后也很好用,同样支持所有扩展名。

对比你原来的方法,这两种都不用手动逐个添加扩展名的替换逻辑,扩展性强太多啦~

内容的提问来源于stack exchange,提问作者codeexplorer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:11:29