因此,我正在尝试重命名文件以匹配plex mediaserver的命名约定。(SxxEyy)
现在,我有大量使用例如的文件。S04E11为411。我编写了一个小函数,它将搜索这种模式的出现并将其替换为正确的约定。像这样 :
pattern1 = re.compile('[Ss]\\d+[Ee]\\d+')
pattern2 = re.compile('[\.\-]\d{3,4}')
def plexify_name(string):
#If the file matches the pattern we want, don't change it
if pattern1.search(string):
return string
elif pattern2.search(string):
piece_to_change = pattern2.search(string)
endpos = piece_to_change.end()
startpos = piece_to_change.start()
#Cut out the piece to change
cut = string[startpos+1:endpos-1]
if len(cut) == 4:
cut = 'S'+cut[0:2] + 'E' + cut[2:4]
if len(cut) == 3:
cut = 'S0'+cut[0:1] + 'E' + cut[1:3]
return string[0:startpos+1] + cut + string[endpos-1:]
而且效果很好。但事实证明,某些文件名中将包含一年。the.flash.2014.118.mp4在这种情况下,它将更改2014。
我尝试使用
pattern2.findall(string)
哪个确实会返回这样的字符串列表-> ['.2014','.118'],但是我想要的是matchobjects的列表,因此我可以检查是否有2个,在这种情况下,请使用第二。我似乎在re文档中找不到能做到这一点的东西。我缺少某些东西还是需要采取完全不同的方法?
您可以尝试将匹配项锚定到文件扩展名:
pattern2 = re.compile(r'[.-]\d{3,4}(?=[.]mp4$)')
这(?= ... )
是一个前瞻性断言,这意味着必须有东西才能使正则表达式匹配,但这不是匹配的一部分:
>>> pattern2.findall('test.118.mp4')
['.118']
>>> pattern2.findall('test.2014.118.mp4')
['.118']
>>> pattern2.findall('test.123.mp4.118.mp4')
['.118']
当然,您希望它与所有可能的扩展一起使用:
>>> p2 = re.compile(r'[.-]\d{3,4}(?=[.][^.]+$)')
>>> p2.findall('test.2014.118.avi')
['.118']
>>> p2.findall('test.2014.118.mov')
['.118']
如果情节编号和扩展名之间还有更多内容,则用于匹配的正则表达式会变得棘手,因此我建议使用非正则表达式方法来处理:
>>> f = 'test.123.castle.2014.118.x264.mp4'
>>> [p for p in f.split('.') if p.isdigit()][-1]
'118'
或者,您也可以通过使用finditer
迭代器并将其转换为列表来扩展,从而获得所有匹配项的匹配对象:
>>> p2 = re.compile(r'[.-]\d{3,4}')
>>> f = 'test.2014.712.x264.mp4'
>>> matches = list(p2.finditer(f))
>>> matches[-1].group(0)
'.712'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句