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

正则表达式匹配Python中rar归档文件集的第一个文件,python,regex,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 我在线程上发现了一个类似的正

我需要解压目录中的所有文件,为此我需要找到集合中的第一个文件。我目前正在使用一堆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似乎不支持可变长度的lookarounds。单行正则表达式会很复杂,但我会很好地记录它,这不是问题。这只是一个问题,你打你的堆,结束

提前谢谢各位


:)

没有必要为此使用look-behind断言。因为你从字符串的开头开始看,你可以用look aheads做任何事情,你可以用look behinds做任何事情。这应该起作用:

^((?!\.part(?!0*1\.rar$)\d+\.rar$).)*\.(?:rar|r?0*1)$
要按要求捕获文件名的第一部分,可以执行以下操作:

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

不要依赖文件名来确定哪一个是第一个。你最终会发现一个边缘案例,在那里你得到了错误的文件

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

头标志位标志:
2字节

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

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



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

是否确实要匹配这些案例

是的,r01

它们不是第一个归档文件:。rar始终是

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

是的,r001

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


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

它只支持可变长度的look behinds。看一看头很好。看文件名是处理文件的根本错误方法。文件名只是元数据;注释。只要有可能,您应该依赖文件的实际内容,而不是文件名。只要文件没有损坏,文件的实际内容就会正确。事实上,这就是腐败的定义。例如,名为
file.part8.rar
的第一个卷文件没有损坏,但基于文件名的方法将无法将其识别为第一个卷;这就是RAR卷的关联方式,任何其他方法都需要打开目录中的每个文件,这在大目录中会慢得多。@Glenn:如果这些文件没有扩展名,并且随机分配了名称,该怎么办?我必须定期处理这样的文件,并根据它们的标题确定它们的类型。你并不总是拥有健全的文件名,那么它们就不是分裂的RAR,这是有争议的文件格式。文件名是RAR文件格式的一部分;如果通过重命名拆分的RAR来打破它们之间的关联,则需要在RAR文件格式之外定义自己的机制,以便稍后重新建立它。WinRAR本身不会“发现”除文件名以外的相关部分。您会注意到,您的链接()中甚至明确提到了“新卷命名方案”,这是指预期的文件名layout.Moi-Reko。我有两个问题,我可能需要再次麻烦你。1.我无法与这两个相提并论。是。r01是。r001 2。是否可以将文件名的第一部分捕获到捕获组中?像这样:yes.part01.rar>>yes testfile.rar>>testfile new.file.part01.rar>>new.file似乎我的正则表达式技能要么可怜要么严重生锈。帕尔乔恩·基托克西亚。我编辑了regexp以便它与您指定的案例相匹配。第二个regexp还将捕获文件名的basename。您编写的第二个正则表达式似乎在文件名为.r01、r001或其他.rar的情况下捕获了文件名,但它似乎与部分情况不匹配。请再来点帮助?谢谢你的帮助。@IDANG:看我的答案。不要使用这种方法,因为它是错误的。@mridang:对不起,这里有一个小错误,现在修复了第二个regexp@威尔博:这本身并没有错。它很好地回答了最初的问题,尽管我同意您的观点,即检查文件的实际头是解决这个问题的正确方法。我明白你的意思。我已经在Python上工作了一段时间,但我从未使用过类似的东西。我也可以对ZIP文件使用类似的方法吗?你知道阅读文件头的好教程吗?有什么图书馆吗?你的解决方案听起来很可靠。我希望我的Python技能也同样强大(谢谢。你知道如何用Python读取文件吗?因为这就是你所要做的。我不懂任何Python,但我无法想象文件IO在其中是困难的。现在有意义了。文件IO非常简单,我已经使用过它。我将做一些挖掘,并寻找类似的东西。我看到了一些读取JPEG头的示例。我将看看这些示例o了解它是如何工作的。非常感谢!嗨,Welbog。我最终还是使用了你的解决方案。不是在Pyth