2010-03-29 20 views
2

我需要解壓縮目錄中的所有文件,爲此我需要找到該集合中的第一個文件。我目前正在使用一堆if語句和循環來做這件事。我可以使用正則表達式來做到這一點嗎?正則表達式匹配在Python中設置的rar壓縮文件中的第一個文件

下面是我需要匹配的文件列表:

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的沒有按」 t支持可變長度的外觀。單行的正則表達式會很複雜,但我會很好地記錄它,這不是問題。這只是你打敗了你的堆的其中一個問題。

在此先感謝你們。

:)

+0

它只支持可變長度的後視。預見很好。 – 2010-03-29 13:03:50

+3

查看文件名是處理文件的根本不正確的方法。文件名只是元數據;一個註釋。只要有可能,你應該依靠文件的實際內容而不是他們的名字。只要文件沒有損壞,文件的實際內容就會正確。事實上,這就是腐敗的定義。例如,名爲'file.part8.rar'的第一卷文件沒有損壞,但基於文件名的方法將無法將其識別爲第一卷。 – Welbog 2010-03-29 13:21:00

+0

您*有*查看文件名以確定哪些文件位於第一個RAR集中;這就是RAR卷的關聯方式,而任何其他方法都需要打開目錄中的每個文件,這在大型目錄中會慢很多。 – 2010-03-29 17:21:21

回答

2

這裏沒有必要使用後面的斷言。既然你從字符串的開頭開始尋找,你可以用預測來做任何事情,你可以用後視。這應該工作:

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

拍攝爲您所請求的文件名的第一部分,你可以這樣做:

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

。 我有兩個問題,我可能需要再次麻煩你。 1.我無法匹配這兩個。 yes.r01 yes.r001 2.是否有可能將文件名的第一部分捕獲到捕獲組中?就像這樣: yes.part01.rar >>是 testfile.rar >> testfile的 new.file.part01.rar >> new.file 看來我的正則表達式的技能或者是可憐的,非常生疏。 Paljon kiitoksia。 Mridang。 – 2010-03-29 13:10:52

+0

我編輯了正則表達式,以便它匹配您指定的個案。第二個正則表達式還將捕獲文件名的基名。 – 2010-03-29 13:23:27

+0

再次嗨Reko,我試過第一個正則表達式,它按預期工作 - 甚至匹配r001,r01類型。 你寫的第二個正則表達式似乎在文件名是.r01,r001或something.rar的情況下捕獲文件名,但它似乎不匹配* part *的情況。請多幫忙一下?感謝您的幫助。 – 2010-03-29 13:40:16

5

不要依賴於文件的名稱,以確定哪一個是第一。你最終會發現一個邊緣案例,你會得到錯誤的文件。

RAR's headers會告訴你哪個文件是捲上的第一個文件,假設它們是在RAR的新版本中創建的。

HEAD_FLAGS位標誌:
2個字節

0100 - 第一冊(只有RAR 3.0及更高版本設置)

所以打開每個文件並檢查RAR頭文件,專門查找指示哪個文件是第一個卷的標誌。只要檔案沒有損壞,這永遠不會失敗。


更新:我剛下考慮看看在十六進制編輯器的一些跨越檔案證實了這一點。文件標題的構建與上面的鏈接完全相同。這只是打開文件並閱讀該標誌的標題。帶有該標誌的文件是第一卷。

+0

您好Welbog。我明白你的意思。我一直在研究Python,但是我從來沒有用過類似的東西。我是否也可以對ZIP文件使用類似的方法?你知道閱讀文件頭文件的好教程嗎?有某種圖書館嗎?你的解決方案聽起來很健壯我希望我的Python技能同樣強大。 :(謝謝 – 2010-03-29 13:43:01

+0

你知道如何在Python中讀取文件嗎?因爲這就是你必須要做的事情,我不知道任何Python,但我無法想象文件IO在它裏面很難 – Welbog 2010-03-29 13:50:25

+0

現在有意義。 IO非常簡單,我已經使用它了,我會做一些挖掘並尋找類似的東西,我看到了一些閱讀JPEG頭文件的例子,我會看看那些知道它是如何工作的 謝謝ton! – 2010-03-29 13:52:45

0

您確定要匹配這些情況嗎?

yes.r01

他們不是第一檔:.rar程序始終是。

It's bla.rar,bla。r00然後只有bla.r01。如果您將.r01和.rar作爲第一個存檔,您可能會提取文件兩次。

yes.r001

.r001不存在。你的意思是WinRAR支持的.001文件嗎? .r99之後,它是.s00。如果它確實存在,則有人手動重命名這些文件。

從理論上講,匹配文件名應該與匹配0x0100標誌一樣可靠,以查找第一個歸檔。

相關問題