解析srt字幕

11 投票
6 回答
18601 浏览
提问于 2025-04-15 21:28

我想解析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|$)'

撰写回答