我需要解压缩目录中的所有文件,为此我需要找到集合中的第一个文件。我目前正在使用一堆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不支持可变长度的外观。单行正则表达式会很复杂,但我会很好地记录它,这不是问题。这只是你击败堆积的问题之一。
先谢谢你们。
:)
答案 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标志上的匹配一样可靠,以找到第一个档案。