正则表达式匹配Python中的rar存档文件集中的第一个文件

时间:2010-03-29 12:41:18

标签: python regex

我需要解压缩目录中的所有文件,为此我需要找到集合中的第一个文件。我目前正在使用一堆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

我在this线程上发现了类似的正则表达式,但似乎Python不支持可变长度的外观。单行正则表达式会很复杂,但我会很好地记录它,这不是问题。这只是你击败堆积的问题之一。

先谢谢你们。

:)

3 个答案:

答案 0 :(得分:5)

不要依赖文件名来确定哪一个是第一个。你最终会找到一个边缘情况,你得到错误的文件。

RAR's headers将告诉您哪个文件是卷中的第一个文件,假设它们是在最新版本的RAR中创建的。

  

HEAD_FLAGS位标志:
  2个字节

     
    

0x0100 - 第一个卷(仅由RAR 3.0及更高版本设置)

  

因此,打开每个文件并检查RAR标头,专门查找指示哪个文件是第一个卷的标志。只要存档没有损坏,这将永远不会失败。


更新:我刚刚通过查看十六进制编辑器中的某些生成存档来确认这一点。文件头的构造与上面指示的链接完全相同。这只是打开文件并读取该标志的标题。带有该标志的文件是第一个卷。

答案 1 :(得分:2)

没有必要为此使用断言。由于您从字符串的开头开始查看,因此您可以通过后视来执行所有操作。这应该有效:

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

要按照您的要求捕获文件名的第一部分,您可以这样做:

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

答案 2 :(得分:0)

您确定要匹配这些案例吗?

  

yes.r01

它们不是第一个档案:.rar永远是。

这是bla.rar,bla.r00然后只有bla.r01。如果将.r01和.rar作为第一个存档匹配,则可能会提取两次文件。

  

yes.r001

.r001不存在。你的意思是WinRAR支持的.001文件吗? 在.r99之后,它是.s00。如果确实存在,则有人手动重命名文件。

理论上,文件名匹配应该与0x0100标志上的匹配一样可靠,以找到第一个档案。