Python String Очистка - PullRequest
       8

Python String Очистка

2 голосов
/ 06 октября 2011

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

"Seven_Pounds_(BDrip_1080p_ENG-ITA-GER)_Multisub_x264_bluray_.mkv",  
"The_Birds_1963_HDTV_XvidHD_720p-NPW.avi",  
"1892.XVID.AC3.HD.120_min.avi"  

и превратить их в:
"Семь фунтов",
"Птицы",
"1892"

Я рассмотрел использование re для экранирования выражений, но этот метод, скорее всего, потерпит неудачу в последнем примере. Программа Media Gerbil использует алгоритм 1011 * google diff-match-patch для очистки строк. Это кажется лучшей альтернативой, но я не уверен, как это реализовать. Есть ли другой, более эффективный метод очистки строк в Python / PyQt, или regex или diff-match-patch - лучший путь для подражания?

Ответы [ 5 ]

2 голосов
/ 06 октября 2011

Я действительно сделал это в один момент ... вы в основном выполняете серию шагов

  • Устранить что-либо в [], () или {} '
  • Удалить расширение файла
  • Теперь разделить на [\ s.-_]

В вашем случае вы получите:

Seven Pounds Multisub x264 bluray
The Birds 1963 HDTV XvidHD 720p NPW
1892 XVID AC3 HD 120 min

Теперь вы в основном сохраняете список слов, которые необходимо удалить из списка, прежде чем смотреть на него. Очевидные примеры из этого примера: x264, Multisub, bluray, HDTV, XvidHD, Xvid, HD, 720p, 1040p, AC3. Обратите внимание, что здесь вы хотите выполнить сравнение без учета регистра.

Обратите внимание, что этот список будет расширяться вручную при прохождении коллекции, и это оставляет вас с

Seven Pounds
The Birds 1963
1892 120 min

Это примерно столько же, сколько вы получите для полуавтоматической системы. Один из приведенных выше методов сказал бы вам очистить числа, которые не отображаются спереди, но я бы отметил, что вы испортите такие вещи, как «История игрушек 2».

В моем случае я выполнил описанную выше обработку, а затем попытался выяснить, какие шаблоны каталогов соответствуют архивации. Затем у меня был интерфейс на основе curses, который позволял мне прокручивать и вручную корректировать выводы сценария (включая переименование).

РЕДАКТИРОВАТЬ: После второго размышления, мой сценарий на самом деле сделал предположение, что набор секунд чисел (а также все, что впоследствии) может быть безопасно удален. Это все эвристики, и вы будете сталкиваться с исключениями. Добавление этого шага исправило бы заголовок последнего примера к 1892.

2 голосов
/ 06 октября 2011

на основе вашего примера:

import re

a="The_Birds_1963_HDTV_XvidHD_720p-NPW.avi"
b="Seven_Pounds_(BDrip_1080p_ENG-ITA-GER)_Multisub_x264_bluray_.mkv"
c="1892.XVID.AC3.HD.120_min.avi"

def cleanit(str):
    result = []
    l = re.split('[_.]',str)
    flag = 0
    if re.match('^[a-zA-z]+',l[0]):
        flag = 1
    elif re.match('^[0-9]+',l[0]):
        flag = 2

    if flag == 1:
        for x in l:
            if not re.match('^[a-zA-Z]+',x):
                break;
            result.append(x) 
        return " ".join(result)

    if flag == 2:
        for x in l:
            if not re.match('^[0-9]+',x):
                break;
            result.append(x) 
        return " ".join(result)

if __name__ == '__main__':
    print cleanit(a)
    print cleanit(b)
    print cleanit(c)

напечатает:

kent$  python cleanit.py
The Birds
Seven Pounds
1892
2 голосов
/ 06 октября 2011

Судя по внешнему виду diff-match-patch, match является наиболее близким к тому, о чем вы говорите, мне кажется, что это, возможно, не лучшее решение, так как match, очевидно, хочет найти конкретные шаблоны (а не правила регулярных выражений)?

Я думаю, что вы, возможно, захотите определить ряд правил регулярных выражений, таких как подчеркивание, которое рассматривается как пробел между словами, и любые не-[a-zA-Z0-9 _] +, возможно, сигнализирующие конец заголовка. Вы должны были бы по крайней мере предположить, что ваш заголовок начинается с начала строки, а затем совпадать с образцом, пока не будет достигнут символ «не слово».

Может быть, как-то так?

rx = re.compile(r'([a-zA-Z\d_]+[a-zA-Z\d])[_.]?')

Но, к сожалению, как упоминалось в другом из этих ответов, нет никакого способа по-настоящему разобраться с «Птицами 1963 года». Я думаю, что решение - это комбинация предположения, где заголовок должен начинаться и, возможно, останавливаться, и наличия списка общих тегов, которые можно удалить.

Редактировать - Мысль о дополнительной информации

Может быть, как только вы сузите свой потенциальный заголовок настолько, насколько сможете, вы можете ТОГДА сделать Google Diff-Match-patch по поиску API на imdb.com и найти наиболее близкое соответствие с настоящим заголовком.

1 голос
/ 06 октября 2011

Судя по примерам, выглядит очень сложно, независимо от техники.Как программа должна знать, что 1963 не является частью названия среднего фильма?Возможно, вам лучше всего иметь список сокращений, а затем обрезать строку, начиная с первого соответствующего сокращения и далее.Это даст вам The Birds 1963 для решения, но я действительно не вижу способа обойти это.

0 голосов
/ 06 октября 2011

Вырезать подчеркиванием, пробелами, точками.

Отфильтруйте очевидные части, такие как x264 или BDRip или multisub .

Запрос IMDB для фильма с этими словами в названии:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...