2012-01-25 37 views
2

我在EventGhost中使用Python腳本來匹配目錄中的某些文件類型,並將它們移動到某些地方以供其他程序對其執行操作。這裏是整個腳本:使用Python匹配拆分RAR擴展

import shutil 
import os 

SubFileTypes = ('sub','srt','txt') 
ZipFileTypes = ('rar','zip','7z','r0') 
MediaFileTypes = ('mkv','avi','mp4','wmv') 
DownloadName = ''.join(eg.event.payload) 
FileName = os.path.basename(DownloadName) 
isFolder = os.path.isdir(DownloadName) 
eg.globals.tvzip = 'J:\\DL\\TVzip\\' 
eg.globals.tvzipdir = eg.globals.tvzip+FileName+'\\' 
eg.globals.tvproc = 'J:\\DL\\TVProc\\' 

if isFolder == True: 
    os.mkdir(eg.globals.tvzipdir) 
# print 'I\'m a folder!' 
    for root, dirs, files in os.walk(DownloadName): 
     for f in files: 
      if f.endswith(ZipFileTypes): 
       #print 'I\'m a zip file!' 
       shutil.copy(os.path.join(root,f),eg.globals.tvzipdir) 
      if f.endswith(SubFileTypes) or f.endswith(MediaFileTypes): 
       #print 'I\'m a subtitle or media file!' 
       shutil.copy(os.path.join(root,f),eg.globals.tvproc) 

elif isFolder == False: 
    shutil.copy(DownloadName,eg.globals.tvproc) 
    eg.plugins.EventGhost.DisableItem(XmlIdLink(23)) 
# print 'I\'m NOT a folder!' 

else: 
    print 'I dont know what I am!' 

我遇到的具體問題是,我需要的是來自於一個分裂RAR格式每個.rX擴展匹配的能力。這些擴展名從r0開始,可以無限制地結束。他們至少是「r +兩位數」(r00,r01,r02等),但我認爲他們可以達到兩位數以上,儘管我不積極。

是否有某種方式可以改變我的ZipFileTypes列表以包含這些分割rar擴展?還是有另一種方式?

回答

1

您可以使用正則表達式來匹配.r後跟任意數量的數字結尾的文件名:

import re 

# -snip- 

    for f in files: 
     if f.endswith(ZipFileTypes) or re.search(r'\.r\d+$', f): 
      # do stuff 

re.search()將尋找一個匹配的任何位置的字符串,而re.match()將尋找一個完整的字符串匹配。對於這種情況,因爲我們只關心文件擴展名,所以我們將使用re.search()

正則表達式的結構如下:

  • \.r - 單一週期,接着是r匹配。 \轉義是必要的,因爲.其他方式意味着通配符。
  • \d+ - 匹配任意數量的數字。 \d代表一個數字,+代表「以前的1+」
  • $ - 匹配字符串的結尾。

將它們放在一起放入\.r\d+$並且您匹配一個拆分rar擴展名。

+0

會''.r \ d \ d + $'或'\ .r \ d {2,} $'會更好嗎?這樣'.r1'將不匹配,因爲它總是至少2位數。 – FakeRainBrigand

+0

取決於問題是否有一個用例,他們實際上會擁有不希望與'.r1'擴展名匹配的文件。這是更簡單,否則,使您的正則表達式更復雜只是意味着難以閱讀:) – lunixbochs

0

使用正則表達式,我不知道如何在Python中完全做到這一點,但你會想匹配像/.r[0-9]*/之類的東西,只要你匹配就行文件名稱。

+0

這正則表達式將匹配任何文件除第一個字符外的任何地方都有'r'。 – lunixbochs

0

隨着舊的命名模式,分檔的語法規則如下:。

.rar或.r00 - .r99命名,.s00 - .s99,.t00 - .z99,{00 - 99 { ,| 00 ...

你可以測試它:當它試圖創建一個檔案.|00

rar a -v0.1m -vn -m0 test.rar testfile 

Windows會提示錯誤。此外,它並不重要,因爲從.rar直到.z99有901個零件。這在正常情況下不應該達到。

但是我看到的分裂檔案與.s[xx],所以我建議這個正則表達式:

r'\.[r-z]{1}(([0-9]{2})|ar)$' 

而對於小速度的提高使用這種方式:

import re 

#some code 

#compile the regex 
reg_rar = re.compile(r'\.[r-z]{1}(([0-9]{2})|ar)$') 
for root, dirs, files in os.walk(DownloadName): 
    for f in files: 
     if reg_rar.search (f) : 
      #do sth