解析srt字幕
我想解析srt字幕:
1
00:00:12,815 --> 00:00:14,509
Chlapi, jak to jde s
těma pracovníma světlama?.
2
00:00:14,815 --> 00:00:16,498
Trochu je zesilujeme.
3
00:00:16,934 --> 00:00:17,814
Jo, sleduj.
每个项目都放到一个结构里。用这个正则表达式:
A:
RE_ITEM = re.compile(r'(?P<index>\d+).'
r'(?P<start>\d{2}:\d{2}:\d{2},\d{3}) --> '
r'(?P<end>\d{2}:\d{2}:\d{2},\d{3}).'
r'(?P<text>.*?)', re.DOTALL)
B:
RE_ITEM = re.compile(r'(?P<index>\d+).'
r'(?P<start>\d{2}:\d{2}:\d{2},\d{3}) --> '
r'(?P<end>\d{2}:\d{2}:\d{2},\d{3}).'
r'(?P<text>.*)', re.DOTALL)
还有这段代码:
for i in Subtitles.RE_ITEM.finditer(text):
result.append((i.group('index'), i.group('start'),
i.group('end'), i.group('text')))
用代码B的时候,我的数组里只有一个项目(因为贪婪的.*),而用代码A的时候,我的'text'是空的,因为用了非贪婪的.*?
怎么解决这个问题呢?
谢谢
6 个回答
15
我对现有的Python字幕库感到很沮丧,因为它们通常比较复杂,而且使用了自定义的类,而不是Python标准的类型。因此,我花了大约一年的时间自己开发了一个字幕库。你可以在这里找到它:https://github.com/cdown/srt.
我尽量让这个库简单,类的数量也不多(除了核心的Subtitle类,它主要是用来存储SRT块数据)。这个库可以读取和写入SRT文件,还能把不合规的SRT文件转换成合规的。
下面是一个使用示例,使用你的示例输入:
>>> import srt, pprint
>>> gen = srt.parse('''\
... 1
... 00:00:12,815 --> 00:00:14,509
... Chlapi, jak to jde s
... těma pracovníma světlama?.
...
... 2
... 00:00:14,815 --> 00:00:16,498
... Trochu je zesilujeme.
...
... 3
... 00:00:16,934 --> 00:00:17,814
... Jo, sleduj.
...
... ''')
>>> pprint.pprint(list(gen))
[Subtitle(start=datetime.timedelta(0, 12, 815000), end=datetime.timedelta(0, 14, 509000), index=1, proprietary='', content='Chlapi, jak to jde s\ntěma pracovníma světlama?.'),
Subtitle(start=datetime.timedelta(0, 14, 815000), end=datetime.timedelta(0, 16, 498000), index=2, proprietary='', content='Trochu je zesilujeme.'),
Subtitle(start=datetime.timedelta(0, 16, 934000), end=datetime.timedelta(0, 17, 814000), index=3, proprietary='', content='Jo, sleduj.')]
22
为什么不使用 pysrt 呢?
9
文本后面跟着一个空行,或者文件的结尾。所以你可以使用:
r' .... (?P<text>.*?)(\n\n|$)'