Se você é dedicado o suficiente para mexer com expressões regulares (no exemplo fornecido), sugiro apenas ir um passo adiante e escrever um pequeno script - digamos, em Python. Dessa forma, você poderá realizar absolutamente quaisquer transformações nos nomes de arquivos.
Eu estimaria que o script python não teria mais do que 15 a 20 linhas, então definitivamente não é uma tarefa enorme. Usar apenas regexps, como você está tentando, é muito mais limitado.
Aqui está minha opinião sobre esse roteiro:
#!/usr/bin/python
import os,re
files = os.listdir('.')
SEASONS = (
(1, 1, 3), # the format is - season number, first episode, last episode
(2, 50,52),
(3, 53,55),
(4, 56,99),
)
for f in files:
# skip all files which are not .mp4
if not f.endswith(".mp4"):
continue
# find the first number in the filename
matches = re.findall("\d+", f)
if not len(matches):
print "skipping", f
num = int(matches[0])
for season in SEASONS:
if num <= season[2]:
season_num = season[0]
ep_num = num - season[1] + 1
new_file_name = "BleachS%02dE%02d.mp4" % (season_num, ep_num)
# This is for testing
print "%s ==> %s" % (f, new_file_name)
# Uncomment the following when you're satisfied with the test runs
# os.rename(f, new_file_name)
break
print "Done"
Parece que eu subestimei o tamanho do script (é de 36 linhas atm), embora eu tenha certeza que se você for para stackoverflow com este código, você terá muitas sugestões que são muito mais elegantes
E só porque eu disse que pode ser feito em 15 linhas ... o seguinte é 20 linhas, das quais 5 são de configuração: P
#!/usr/bin/python
import os, re, glob
SEASONS = (
{'num':1, 'first':1, 'last':3}, # the format is - season number, first episode, last episode
{'num':2, 'first':50, 'last':52},
{'num':3, 'first':53, 'last':55},
{'num':4, 'first':56, 'last':99},
)
files = glob.glob('bleach*.mp4')
for f in files:
num = int(re.findall("\d+", f)[0]) # find the first number in the filename
for season in SEASONS:
if num > season['last']: continue
new_file_name = "BleachS%02dE%02d.mp4" % (season['num'], num - season['first'] + 1)
print "%s ==> %s" % (f, new_file_name) # This is for testing
# os.rename(f, new_file_name) # Uncomment this when you're satisfied with the test runs
break