使用正则表达式解析.srt文件

use*_*290 1 python regex srt

我在python中做了一个小脚本,但由于我很新,我陷入了一个部分:我需要从.srt文件中获取时间和文本.例如,来自

1
00:00:01,000 --> 00:00:04,074
Subtitles downloaded from www.OpenSubtitles.org
Run Code Online (Sandbox Code Playgroud)

我需要得到:

00:00:01,000 --> 00:00:04,074

Subtitles downloaded from www.OpenSubtitles.org.

我已经设法制作正则表达式,但我被困在文本中.我试图使用我的正则表达式后面的时间:

( ?<=(\d+):(\d+):(\d+)(?:\,)(\d+) --> (\d+):(\d+):(\d+)(?:\,)(\d+) )\w+
Run Code Online (Sandbox Code Playgroud)

但没有效果.就个人而言,我认为使用背后外观是解决这个问题的正确方法,但我不确定如何正确地编写它.谁能帮我?谢谢.

roi*_*ppi 12

老实说,我认为没有任何理由在这个问题上抛出正则表达式. .srt文件结构严谨.结构如下:

  • 从1开始的整数,单调递增
  • 开始 - >停止计时
  • 一行或多行字幕内容
  • 一个空白行

......并重复一遍.请注意粗体部分 - 您可能必须在时间码之后捕获1,2或20行字幕内容.

所以,只需利用结构.通过这种方式,您可以一次解析所有内容,而无需一次将多行放入内存中,并且仍然可以将每个字幕的所有信息保存在一起.

from itertools import groupby
# "chunk" our input file, delimited by blank lines
with open(filename) as f:
    res = [list(g) for b,g in groupby(f, lambda x: bool(x.strip())) if b]
Run Code Online (Sandbox Code Playgroud)

例如,使用SRT doc页面上的示例,我得到:

res
Out[60]: 
[['1\n',
  '00:02:17,440 --> 00:02:20,375\n',
  "Senator, we're making\n",
  'our final approach into Coruscant.\n'],
 ['2\n', '00:02:20,476 --> 00:02:22,501\n', 'Very good, Lieutenant.\n']]
Run Code Online (Sandbox Code Playgroud)

我可以进一步将其转换为有意义的对象列表:

from collections import namedtuple

Subtitle = namedtuple('Subtitle', 'number start end content')

subs = []

for sub in res:
    if len(sub) >= 3: # not strictly necessary, but better safe than sorry
        sub = [x.strip() for x in sub]
        number, start_end, *content = sub # py3 syntax
        start, end = start_end.split(' --> ')
        subs.append(Subtitle(number, start, end, content))

subs
Out[65]: 
[Subtitle(number='1', start='00:02:17,440', end='00:02:20,375', content=["Senator, we're making", 'our final approach into Coruscant.']),
 Subtitle(number='2', start='00:02:20,476', end='00:02:22,501', content=['Very good, Lieutenant.'])]
Run Code Online (Sandbox Code Playgroud)