用Python处理字幕文件

下了部老电影,找到了相关的中英文字幕,奇怪的是,英文字幕能正常现实,中文字幕却不可以,我一度以为是Linux下播放器编码的问题,但是怎么更改设置都无效,而我以前在看其他电影时,中文字幕是正常的。所以,怀疑是字幕文件的问题,打开中英文字幕文件对比:

  • 英文
5
00:02:53,500 --> 00:02:54,700
Police. Hello?

6
00:03:03,800 --> 00:03:08,000
EVERYONE IS THE MOON

7
00:03:10,100 --> 00:03:13,700
I CAN'T HANG ON ANYMORE
  • 中文

5

00:02:53,500 - - > 00:02:54,700

警察。喂?

6

00:03:03,800 - - > 00:03:08,000

每个人都是月亮

7

00:03:10,100 - - > 00:03:13,700

我不能坚持下去了

可以看出,中文字幕的格式有问题,所以我决定用Python的正则表达式修改一下。

代码

import re

with open('./Minazuki 1999.srt', encoding='utf-8') as file:
    srt = file.read()

# 第一步多余换行
srt = srt.replace('\n\n', '\n')
# 需要在序号前面补上换行
srt = re.sub(r'\n(\d{1,3})\n', r'\n\n\1\n', srt)
# 修正其他字符错误
srt = srt.replace('- - ', '--')

with open('./Minazuki 1999_new.srt', 'w', encoding='utf-8') as file:
    file.write(srt)
  • 输出的字幕文件:
5
00:02:53,500 --> 00:02:54,700
警察。喂?

6
00:03:03,800 --> 00:03:08,000
每个人都是月亮

7
00:03:10,100 --> 00:03:13,700
我不能坚持下去了

已经可以正常显示了。

学到的知识点记录

参考了这篇博客, 正则表达式30分钟入门教程
可是使用()来对正则模式匹配的内容进行编号,在后续中用数字来\数字使用对应的内容,如

srt = re.sub(r'\n(\d{1,3})\n', r'\n\n\1\n', srt)

其中,(\d{1,3})表示的内容,在后面用\1来访问,\0表示整个正则表达式。除了编号,也可以命名,例如(?<Numers>\d{1,3}),在后面可以用\k<Numbers>来访问,不过该方法在我在Python中未成功使用,有待进一步调查。

posted @ 2017-08-14 00:41  changediff  阅读(5350)  评论(0编辑  收藏  举报