老实说,我看不出有任何理由在这个问题上抛出正则表达式。 .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]
例如,使用 SRT 文档页面上的示例,我得到:
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']]
我可以进一步将其转换为有意义的对象列表:
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.'])]