使用Python匹配分割RAR扩展名
我在EventGhost里用一个Python脚本来匹配某个文件夹里的特定文件类型,然后把它们移动到其他地方,让其他程序对这些文件进行处理。下面是整个脚本:
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扩展名也包括进去?或者有没有其他的方法?
3 个回答
在旧的命名规则中,分割的压缩文件遵循以下格式:
.rar, .r00 - .r99, .s00 - .s99, .t00 - .z99, .{00 - .{99, .|00 ...
你可以用以下代码来测试:
rar a -v0.1m -vn -m0 test.rar testfile
当Windows尝试创建一个名为 .|00
的压缩文件时,会提示错误。此外,这个问题其实不太重要,因为从 .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
你可以用正则表达式来解决这个问题。我不太确定在Python中具体怎么写,但你可以试试用类似于 /.r[0-9]*/ 的方式来匹配,这样就能找到文件名了。
你可以用正则表达式来匹配以 .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
代表一个数字,+
表示“一个或多个前面的内容”。$
- 匹配字符串的结尾。
把这些组合在一起就是 \.r\d+$
,这样就可以匹配以 .r
结尾并且后面跟着数字的文件名了。