0

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

例如我想要:

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

我正在尝试蟒蛇:

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

但这会产生:

鲜花玫瑰 Muree 25 10 11 jpg 纽约时代广场 20 7 09 png

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

4

5 回答 5

7

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

  1. os.path.splitext获取文件名和扩展名
  2. 对文件名进行任何处理。
  3. 将新文件名与扩展名连接起来。
于 2012-10-23T17:30:59.980 回答
1

您可以使用否定前瞻,它断言您不是在处理仅后跟数字和字母的点:

re.sub(r'(?!\.[A-Za-z0-9]*$)[^A-Za-z0-9]', ' ', filename)
于 2012-10-23T17:28:06.993 回答
1

[\W_](?=.*\.)我建议你用空格替换每个出现的地方

于 2012-10-23T17:28:52.080 回答
1

看看这是否适合你。您实际上可以在没有 Regex 的情况下做到这一点

>>> 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'
>>> 
于 2012-10-23T17:32:27.783 回答
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'
于 2012-10-23T17:33:29.030 回答