python使用正则表达式重命名文件

时间:2019-04-25 18:53:48

标签: python regex

嗨,我想将具有一个源模式(例如IMG_20190401_235959.jpg)的文件重命名为目标模式(例如2019-04-01_23_59_59.jpg)

我正在尝试在python中做到这一点,但我找不到如何使用正则表达式来构建新文件名的方法:

#!/usr/bin/python

import os, glob, sys, re    
os.chdir(sys.argv[1])
for filename in glob.glob("IMG_*.jpg"):
    newfilename = re.sub(?????
    try:
       os.rename(filename,newfilename)
    except OSError,e:
       print e

6 个答案:

答案 0 :(得分:1)

您可以使用re.findall从文件路径中获取必要的组,然后重新加入:

import re
def new_path(s):
  _, a, b, f_type = re.findall('[a-zA-Z0-9]+', s)
  new_b = '_'.join(b[i:i+2] for i in range(0, len(b), 2))
  return f'{a[:4]}-{a[4:6]}-{a[6:]}_{new_b}.{f_type}'

print(new_path('IMG_20190401_235959.jpg'))

输出:

'2019-04-01_23_59_59.jpg'

然后:

import os, glob, sys, re    
os.chdir(sys.argv[1])
for filename in glob.glob("IMG_*.jpg"):
  try:
    os.rename(filename, new_path(filename))
  except OSError,e:
    print(e)

答案 1 :(得分:1)

不确定正则表达式是否是此处的最佳选择。您可以将其拆分并轻松地使用基本的字符串操作:

original = 'IMG_20190401_235959.jpg'
ol = original.split('_')
date = f'{ol[1][:4]}-{ol[1][4:6]}-{ol[1][6:8]}'
time = f'{ol[2][:2]}_{ol[2][2:4]}_{ol[2][4:6]}'
new = f'{date}_{time}.jpg'
print(new)

答案 2 :(得分:0)

以下代码对我有用,但是它仅使用正则表达式删除文件名中的IMG_,因此您也可以完全删除正则表达式。

newfilename = re.sub('IMG_', '', filename)
newfilename = newfilename[0:4] + '-' + newfilename[4:6] + '-' + newfilename[6:11] + '_' + newfilename[11:13] + '_' + newfilename[13:]

答案 3 :(得分:0)

如果您的输入是一致的,这应该起作用:

import re
pattern = r"IMG_(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})"
test_str = "IMG_20190401_235959.jpg"
subst = "\\1-\\2-\\3_\\4_\\5_\\6"
result = re.sub(pattern, subst, test_str, 0, re.MULTILINE)
if result:
    print (result)

# 2019-04-01_23_59_59.jpg

答案 4 :(得分:0)

import re

regex = re.compile(r'^IMG_(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})\.jpeg$')

oldStr = 'IMG_20190401_235959.jpeg';

match = regex.match(oldStr)

newStr = '{}-{}-{}_{}_{}.jpg'.format(*match.groups())

print(newStr) # 2019-04-01_23_59.jpg

答案 5 :(得分:0)

您可以做的是在使用RegEx之前对其进行预编译。您可以按照以下方式进行操作:

import re

sub_name = re.compile(r"IMG_(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})", flags=re.I).sub

在这里, sub_name 是一个函数,您可以稍后在for循环中使用它来替换每个图像的名称。

注意:在Windows中,忽略大小写(大写/小写)可能很有用,但是您还需要将调用调整为glob.glob

以下是使用glob.glob的解决方案,但您也可以使用os.walk浏览目录,搜索所有图像…

# coding: utf-8
import glob
import os
import re
import sys

sub_name = re.compile(r"IMG_(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})", flags=re.I).sub

work_dir = sys.argv[1]

for old_path in glob.glob(os.path.join(work_dir, "IMG_*.jpg")):
    dirname, old_name = os.path.split(old_path)
    new_name = sub_name("\\1-\\2-\\3_\\4_\\5_\\6", old_name)
    new_path = os.path.join(dirname, new_name)
    try:
        os.rename(old_path, new_path)
    except OSError as exc:
        print(exc)

我注意到您使用了print语句和Python 2.6语法作为例外。最好使用新语法。 如果使用Python 2.7,则可以添加指令:

from __future__ import print_function

将其放在您的进口商品的顶部...