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
相关产品推荐
相关产品推荐

