gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:47:24 27 4
gpt4 key购买 nike

我正在用 python 编写一个小脚本,但由于我是新手,所以我被困在了一个部分:我需要从 .srt 文件中获取时间和文本。例如,来自

1
00:00:01,000 --> 00:00:04,074
Subtitles downloaded from www.OpenSubtitles.org

我需要得到:

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

从 www.OpenSubtitles.org 下载的字幕

我已经成功地为计时制作了正则表达式,但我被文本困住了。我尝试使用 look behind 我使用我的正则表达式进行计时:

( ?<=(\d+):(\d+):(\d+)(?:\,)(\d+) --> (\d+):(\d+):(\d+)(?:\,)(\d+) )\w+

但没有效果。就个人而言,我认为使用look behind 是解决此问题的正确方法,但我不确定如何正确编写它。谁能帮我?谢谢。

最佳答案

老实说,我看不出有任何理由在这个问题上使用正则表达式。 .srt 文件是 highly structured .结构如下:

  • 从 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.'])]

关于python - 使用正则表达式解析 .srt 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23620423/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com