我有一些字幕文件,我并不打算记住这些字幕里的每一个字,也没必要记住一些很难的术语,比如:cleidocranial,dysplasia…
我在这里找到了这个脚本:从不在列表中的单元格中删除单词。但我不知道如何修改或运行它。(我使用的是 Linux)
以下是我们的例子:
字幕文件(.srt):
2 00:00:13,000 –> 00:00:15,000 患有颅骨锁骨发育不良的人身体状况良好。
3000个常用词的单词表(.txt):
… 的 人 很好 …
我们需要的输出(.srt):
2 00:00:13,000 –> 00:00:15,000 有**的人是好的。
或者如果可能的话就标记它们(.srt):
2 00:00:13,000 –> 00:00:15,000 患有颅骨发育不良的人身体状况良好。
如果有仅使用纯文本(没有时间码)的解决方案,则可以,只需解释如何运行它即可,
以下仅处理每个'.srt'文件的第 3 行。它可以轻松适应处理其他行和/或其他文件。
'.srt'
import os import re from glob import glob with open('words.txt') as f: keep_words = {line.strip().lower() for line in f} for filename_in in glob('*.srt'): filename_out = f'{os.path.splitext(filename_in)[0]}_new.srt' with open(filename_in) as fin, open(filename_out, 'w') as fout: for i, line in enumerate(fin): if i == 2: parts = re.split(r"([\w']+)", line.strip()) parts[1::2] = [w if w.lower() in keep_words else '*' for w in parts[1::2]] line = ''.join(parts) + '\n' fout.write(line)
结果(对于subtitle.rst您给出的示例:
subtitle.rst
! cat subtitle_new.rst 2 00:00:13,000 --> 00:00:15,000 People with * * are good.
替代方案:只需'*'在词汇表之外的单词旁边添加:
'*'
# replace: # parts[1::2] = [w if w.lower() in keep_words else '*' for w in parts[1::2]] parts[1::2] = [w if w.lower() in keep_words else f'{w}*' for w in parts[1::2]]
输出结果为:
2 00:00:13,000 --> 00:00:15,000 People with cleidocranial* dysplasia* are good.
解释:
open
set
glob
'..._new.srt'
i == 2
enumerate
line.strip()
line.strip().split()
'good.'
"don't"
r"([\w']+)"
parts
'People, who are good.'
['', 'People', ', ', 'who', ' ', 'are', ' ', 'good', '.']
keep_words