Regex для соответствия первому файлу в файле архива rar, установленном в Python - PullRequest
2 голосов
/ 29 марта 2010

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

Вот список файлов, которые мне нужно сопоставить:

yes.rar
yes.part1.rar
yes.part01.rar
yes.part001.rar
yes.r01
yes.r001

Они НЕ должны совпадать:

no.part2.rar
no.part02.rar
no.part002.rar
no.part011.rar
no.r002
no.r02

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

Заранее спасибо, ребята.

:)

Ответы [ 3 ]

5 голосов
/ 29 марта 2010

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

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

HEAD_FLAGS Битовые флаги:
2 байта

0x0100 - Первый том (устанавливается только RAR 3.0 и выше)

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


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

2 голосов
/ 29 марта 2010

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

^((?!\.part(?!0*1\.rar$)\d+\.rar$).)*\.(?:rar|r?0*1)$

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

^((?:(?!\.part\d+\.rar$).)*)\.(?:(?:part0*1\.)?rar|r?0*1)$
0 голосов
/ 11 марта 2011

Вы уверены, что хотите сопоставить эти случаи?

yes.r01

Это не первые архивы: .rar всегда есть.

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

yes.r001

.r001 не существует. Вы имеете в виду файлы .001, которые поддерживает WinRAR? После .r99 это .s00. Если он существует, кто-то переименовал файлы вручную.

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

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