Python 正则表达式,忽略字符,直到某个字符被匹配多次

Python regular expression, ignoring characters until some charater is matched a number of times

我正在重命名从 Torrent 下载的一批文件,想获取剧集的名称,所以我认为正则表达式可以解决问题。我对正则表达式有点陌生,所以我很感激你的帮助。这就是我能想到的:

我有一个 class 与其他重命名函数相关,因此此处定义的函数在此 class 中,它使用文件目录的路径、要重命名的表达式和文件进行初始化扩展。

我正在使用 glob 访问所有扩展名为“.mkv”的文件

为了调试,我打印了所有文件名:

Mr.Robot.S02E01.eps2.0_unm4sk-pt1.tc.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E02.eps2.0_unm4sk-pt2.tc.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E03.eps2.1_k3rnel-pan1c.ksd.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E04.eps2.2_init_1.asec.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E05.eps2.3.logic-b0mb.hc.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E06.eps2.4.m4ster-s1ave.aes.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E07.eps2.5_h4ndshake.sme.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E08.eps2.6.succ3ss0r.p12.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E09.eps2.7_init_5.fve.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E10.eps2.8_h1dden-pr0cess.axx.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E11.eps2.9_pyth0n-pt1.p7z.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E12.eps2.9_pyth0n-pt2.p7z.720p.WEB-DL.x264-[MULVAcoded].mkv




def strip_ep_name(self):
    for i, f in enumerate(self.files):
        f_list = f.split("\")
        name, ext = os.path.splitext(f_list[-1])
        ep_name = name.strip(r'(.*?)".720p.WEB-DL.x264-[MULVAcoded]"')
        print(ep_name)

对我来说,目标是获取剧集的名称,无论有无剧集编号,因为我可以稍后为剧集命名。

输出为:

r.Robot.S02E01.eps2.0_unm4sk-pt1.t
r.Robot.S02E02.eps2.0_unm4sk-pt2.t
r.Robot.S02E03.eps2.1_k3rnel-pan1c.ks
r.Robot.S02E04.eps2.2_init_1.as
r.Robot.S02E05.eps2.3.logic-b0mb.h
r.Robot.S02E06.eps2.4.m4ster-s1ave.aes
r.Robot.S02E07.eps2.5_h4ndshake.sm
r.Robot.S02E08.eps2.6.succ3ss0r.p1
r.Robot.S02E09.eps2.7_init_5.fv
r.Robot.S02E10.eps2.8_h1dden-pr0cess.a
r.Robot.S02E11.eps2.9_pyth0n-pt1.p7z
r.Robot.S02E12.eps2.9_pyth0n-pt2.p7z

我想去掉剧集名称前的所有“.eps2.2”,但他们不按顺序执行。

现在我不知道如何从这里继续前进。有人可以帮忙吗?

首先导入Python的regex模块:

import re

然后用这个替换 from "r.Robot.S02E01.eps2.0_unm4sk-pt1.t" :

ep_name = re.sub(r"eps2\.\d{1,2}(\.|\_)","",episode_name)

在循环中使用 ep_name 并将剧集名称一一传递给 episode_name 然后打印 ep_name.

输出如下:

r.Robot.S02E01.unm4sk-pt1.t

我不确定我是否理解正确,我不知道这个系列,因此我也不知道标题。但是你真的需要re吗?

for f in files:
    print(f[23:-35].split('.')[0])

结果

unm4sk-pt1
unm4sk-pt2
k3rnel-pan1c                                                
init_1                                                      
logic-b0mb                                                  
m4ster-s1ave                                                
h4ndshake                                                   
succ3ss0r                                                  
init_5                                                      
h1dden-pr0cess                                              
pyth0n-pt1                                                  
pyth0n-pt2      

编辑:

我仍然没有在您的 post 中看到实际的目标格式定义,但以防万一@Jan 是正确的,这也是 re-less 解决方案:

for f in files:
    print(f[:16] + '.'.join(f[23:].split('.')[:2]) + '.mkv')

Mr.Robot.S02E01.unm4sk-pt1.tc.mkv
Mr.Robot.S02E02.unm4sk-pt2.tc.mkv
Mr.Robot.S02E03.k3rnel-pan1c.ksd.mkv
Mr.Robot.S02E04.init_1.asec.mkv
Mr.Robot.S02E05.logic-b0mb.hc.mkv
Mr.Robot.S02E06.m4ster-s1ave.aes.mkv
Mr.Robot.S02E07.h4ndshake.sme.mkv
Mr.Robot.S02E08.succ3ss0r.p12.mkv
Mr.Robot.S02E09.init_5.fve.mkv
Mr.Robot.S02E10.h1dden-pr0cess.axx.mkv
Mr.Robot.S02E11.pyth0n-pt1.p7z.mkv
Mr.Robot.S02E12.pyth0n-pt2.p7z.mkv

一步完成:

\.eps\d+\.\d+[-_.](.+?)(?:\.720p.+)\.(\w+)$

分解为:

\.eps\d+\.\d+ # ".eps", followed by digits, a dot and other digits
[-_.]         # one of -, _ or .
(.+?)         # anything else lazily afterwards
(?:\.720p.+)  # until .720p is found (might need some tweaking)
\.            # a dot
(\w+)$        # some word characters (aka the file extension) at the end

这需要替换为 .. 才能最终获得您想要的格式。


Python 中的所有内容:

import re

filenames = """
Mr.Robot.S02E01.eps2.0_unm4sk-pt1.tc.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E02.eps2.0_unm4sk-pt2.tc.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E03.eps2.1_k3rnel-pan1c.ksd.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E04.eps2.2_init_1.asec.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E05.eps2.3.logic-b0mb.hc.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E06.eps2.4.m4ster-s1ave.aes.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E07.eps2.5_h4ndshake.sme.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E08.eps2.6.succ3ss0r.p12.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E09.eps2.7_init_5.fve.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E10.eps2.8_h1dden-pr0cess.axx.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E11.eps2.9_pyth0n-pt1.p7z.720p.WEB-DL.x264-[MULVAcoded].mkv
Mr.Robot.S02E12.eps2.9_pyth0n-pt2.p7z.720p.WEB-DL.x264-[MULVAcoded].mkv
"""

rx = re.compile(r'\.eps\d+\.\d+[-_.](.+?)(?:\.720p.+)\.(\w+)$', re.M)

filenames = rx.sub(r"..", filenames)
print(filenames)

产生

Mr.Robot.S02E01.unm4sk-pt1.tc.mkv
Mr.Robot.S02E02.unm4sk-pt2.tc.mkv
Mr.Robot.S02E03.k3rnel-pan1c.ksd.mkv
Mr.Robot.S02E04.init_1.asec.mkv
Mr.Robot.S02E05.logic-b0mb.hc.mkv
Mr.Robot.S02E06.m4ster-s1ave.aes.mkv
Mr.Robot.S02E07.h4ndshake.sme.mkv
Mr.Robot.S02E08.succ3ss0r.p12.mkv
Mr.Robot.S02E09.init_5.fve.mkv
Mr.Robot.S02E10.h1dden-pr0cess.axx.mkv
Mr.Robot.S02E11.pyth0n-pt1.p7z.mkv
Mr.Robot.S02E12.pyth0n-pt2.p7z.mkv

参见a demo on regex101.com