在python中查找正则表达式第二个匹配项的索引

2024-09-29 00:20:32 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我尝试重命名文件以匹配plex mediaserver的命名约定。(SxxEyy)

现在我有大量的文件使用例如411作为S04E11。我已经编写了一个小函数,它将搜索此模式的出现并用正确的约定替换它。像这样:

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:]

这很有效。但事实证明,有些文件名会有一年的时间。闪光灯.2014.118.mp4在这种情况下,它将更改2014。在

我试着用

^{pr2}$

它确实返回如下字符串列表-->;['.2014','.118'],但我需要的是matchobjects的列表,这样我就可以检查是否有2个,在这种情况下,使用第二个的开始/结束。在re文档中,我似乎找不到可以做这件事的东西。我遗漏了什么,还是需要采取完全不同的方法?在


Tags: 文件thetoresearchstringpieceif
1条回答
网友
1楼 · 发布于 2024-09-29 00:20:32

您可以尝试将匹配项锚定到文件扩展名:

pattern2 = re.compile(r'[.-]\d{3,4}(?=[.]mp4$)')

这里,(?= ... )是一个前瞻性断言,这意味着正则表达式必须存在才能匹配,但它不是匹配的一部分:

^{pr2}$

当然,您希望它能与所有可能的扩展一起工作:

>>> 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'

相关问题 更多 >