繁体   English   中英

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

[英]Regex to match the first file in a rar archive file set in Python

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

在此先感谢大家。

:)

不要依靠文件名来确定哪个是第一个。 您最终将发现一个错误的情况,即您得到了错误的文件。

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

HEAD_FLAGS位标志:
2字节

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

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


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

无需为此使用后视断言。 由于您从字符串的开头开始查找,因此可以使用先行查找和后备查找来完成所有操作。 这应该工作:

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

要按照您的要求捕获文件名的第一部分,可以执行以下操作:

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

您确定要匹配这些情况吗?

yes.r01

他们不是第一个档案:.rar始终是。

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

yes.r001

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

从理论上讲,在文件名上进行匹配应与在0x0100标志上进行匹配以找到第一个存档一样可靠。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM