从文件名中删除标点符号,同时保持文件扩展名不变

时间:2012-10-23 17:25:02

标签: python regex punctuation

我想从文件名中删除所有标点符号,但保持其文件扩展名不变。

e.g。我想要:

Flowers.Rose-Murree-[25.10.11].jpg
Time.Square.New-York-[20.7.09].png

看起来像:

Flowers Rose Muree 25 10 11.jpg
Time Square New York 20 7 09.png

我正在尝试python:

re.sub(r'[^A-Za-z0-9]', ' ', filename)

但这会产生:

Flowers Rose Muree 25 10 11 jpg 时代广场纽约20 7 09 png

如何删除标点符号但保留文件扩展名?

5 个答案:

答案 0 :(得分:7)

只有一种正确的方法可以做到这一点:

  1. os.path.splitext获取文件名和扩展名
  2. 对文件名进行任何处理。
  3. 将新文件名与扩展名连接。

答案 1 :(得分:1)

我建议您使用空格[\W_](?=.*\.)替换每个

答案 2 :(得分:1)

看看这是否适合您。没有正则表达式,你实际上可以做到这一点

>>> fname="Flowers.Rose-Murree-[25.10.11].jpg"
>>> name,ext=os.path.splitext(fname)
>>> name = name.translate(None,string.punctuation)
>>> name += ext
>>> name
'FlowersRoseMurree251011.jpg'
>>> 

答案 3 :(得分:0)

你可以使用负向前瞻,断言你没有处理一个只跟着数字和字母的点:

re.sub(r'(?!\.[A-Za-z0-9]*$)[^A-Za-z0-9]', ' ', filename)

答案 4 :(得分:0)

@katrielalex打败了我的答案类型,但无论如何,一个无正则表达式的解决方案:

In [23]: f = "/etc/path/fred.apple.png"

In [24]: path, filename = os.path.split(f)

In [25]: main, suffix = os.path.splitext(filename)

In [26]: newname = os.path.join(path,''.join(c if c.isalnum() else ' ' for c in main) + suffix)

In [27]: newname
Out[27]: '/etc/path/fred apple.png'