Пакетное переименование фильмов с помощью Regex

Я пытался переименовать некоторые файлы фильмов с помощью регулярных выражений, но до сих пор я был лишь незначительно успешным. Цель состоит в том, чтобы разобрать файлы, как это:

2001.A.Space.Odyssey.1968.720p.BluRay.DD5.1.x264-LiNG.mkv

и переименовать их так:

2001 A Space Odyssey (1968).mkv

Я создал шаблон: ^(.+).(d{4}).+.(mp4|avi|mkv)$

вывод: ().

теперь это прекрасно работает, когда у меня есть фильмы с заголовками из одного слова, но когда есть более одного слова, разделенного точкой, регулярное выражение не захватывает что угодно.

что я здесь делаю неправильно?

30
задан Braiam
06.02.2023 1:36 Количество просмотров материала 2560
Распечатать страницу

2 ответа

ваш шаблон, кажется, отлично работает для меня с этим примером имени файла и Perl в качестве механизма регулярных выражений:

$ echo '2001.A.Space.Odyssey.1968.720p.BluRay.DD5.1.x264-LiNG.mkv' | 
    perl -npe 's/^(.+).(\d{4}).+.(mp4|avi|mkv)$/ ()./'

2001.A.Space.Odyssey (1968).mkv

единственное, что я хотел бы изменить, чтобы избежать . ' s, где вы действительно хотите, чтобы они ссылались на точку, а не подстановочный знак. В частности, вероятно, можно с уверенностью предположить, что последний период до расширения файла на самом деле является периодом - я не уверен в том, что между названием и годом.

3
отвечен ddisisto 2023-02-07 09:24

Я потратил несколько часов на написание и настройку скрипта python, чтобы сделать именно это. Одна из вещей, которые я обнаружил, что довольно часто это не так черно-белый, как обработка одного файла, как это.

Примечание: это python основе, которая потребует настройки, если вы работаете на другом языке

почему я говорю вам это:

  • иногда файл плохо им, а папка с именем, как у вас указанный.
  • иногда вы получите статьи или римские цифры в середине, которые должны/не должны быть прописными
  • вы можете переместить "The" в конец, как в ","
  • иногда дата отсутствует
  • в вашем конкретном примере, Ваш regex будет иметь трудное время дифференциации между 2001 и 1968.

В конце концов, вы можете обнаружить, что разбить функцию на несколько кусков (или с помощью сопоставления) поможет вам разбери ее на части.

вот основные резюме того, что я в конечном итоге с помощью:

1: Установите некоторые глобальные переменные, чтобы обеспечить гибкость:

renamePattern = "%titlethe% %quality% (%year%).%ext%" 
articles = ['a', 'an', 'of', 'the', 'is', 'on', 'at', 'in', 'and']
roman = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XI', 'XII', 'XIII']

2: Проверьте, если файл имеет допустимое имя, в противном случае идти вверх и проверьте папку:

if (re.search(".+(108|72)0p?.+", folder) and re.search(".+(\s|\.)(19|20)[0-9][0-9](.*|(?!p))", folder)):
#appears to have a valid quality and date, return folder

elif (re.search(".+(108|72)0p?.+", file) and re.search(".+(\s|\.)(19|20)[0-9][0-9](.*|(?!p))", file)):
#appears to have a valid date and quality, return file

else:
#return None, which will fail the script

3: сделать некоторые магии

f = re.sub("\.", " ", file_string)
s = re.sub("\.", "", s)

if re.search("\%\w+\%", s):
    if re.search("titlethe", s):
        s = titleCase(f, articles)
        s = re.sub("\s(19|20)[0-9][0-9](.*|(?!p))$", "", s)
        s = re.sub("\s?(108|72)0p\s?", "", s, re.I)
        if re.search("^The\s", s):
            s = re.sub("^The\s", "", s) + ", The"
    elif re.search("thetitle", s):
        #do thetitle stuff
        s = titleCase(f, articles)
        s = re.sub("\s(19|20)[0-9][0-9](.*|(?!p))$", "", s)
        s = re.sub("\s?(108|720)p\s?", " ", s, re.I)
    elif re.search("quality", s):
        if re.search(".*1080p?.*", f, re.I):
            s = "1080p"
        elif re.search(".*720p?.*", f, re.I):
            s = "720p"
    elif re.search("year", s):
        p = re.compile(".+\s(?P<year>(19|20)[0-9][0-9])(.*|(?!p))")
        if p is not None:
            m = p.match(f)
            s = m.group('year')
    elif re.search("ext", s):
        s = getExt(file_name)
return re.sub("[ ]{2,}", " ", s)

Edit: в конце концов, если вы действительно просто хотите скрипт python, который я написал, дайте мне знать, и я опубликую его на sourceforge или git.

0
отвечен brandonscript 2023-02-07 11:41

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх