使用正则表达式从字幕格式化文本的问题

Posted

技术标签:

【中文标题】使用正则表达式从字幕格式化文本的问题【英文标题】:Problem formatting text from captions using regular expressions 【发布时间】:2020-03-01 20:27:10 【问题描述】:

我正在尝试获取字幕文本以对其进行分析,但我无法以可读的方式获取字幕文本。我正在使用正则表达式来获取字幕编号、字幕时间和字幕语音。当它进入演讲时,我会得到很多空白行,因为字幕是像图像一样设置的。所以我只想创建一个只包含语音而不包含空行的列表。我得到的列表也在图片中。

这也是字幕中的一个示例:

1
00:00:00,030 --> 00:00:05,370
so here we are at the offices of my

2
00:00:02,240 --> 00:00:05,370



3
00:00:02,250 --> 00:00:07,319
accountants of your Eric Biddle mr.

4
00:00:05,360 --> 00:00:07,319



5

MY LIST

CAPTIONS:

import re

filename = r'test_subtitle.srt'
pattern_number = re.compile('^\d+$')
pattern_time = re.compile('^[\d]+:[\d]+:[\d]+,[\d]+ --> [\d]+:[\d]+:[\d]+,[\d]+$')
pattern_speech = re.compile("^[A-Za-z,;'\"\\s]+[.?!]*$")

for i, line in enumerate(open(filename)):
    for match in re.findall(pattern_number, line):
        print(match)

for i, line in enumerate(open(filename)):
    for match in re.findall(pattern_time, line):
        print(match)

speech = []

for i, line in enumerate(open(filename)):
    for match in re.findall(pattern_speech, line):
        speech.append(match)

print(speech)

【问题讨论】:

【参考方案1】:

我建议您扫描整个文本,而不是单个行。您还可以在模式中使用组来捕获和包含数据。我会按如下方式读取数据:

with open('test_subtitle.srt', 'r') as f:
    subtitles = f.read()

然后使用以下代码匹配单个部分并提取数据:

import re

num_pat = r'(\d+)'
time_pat = r'(\d2,:\d2:\d2,\d3) --> (\d2,:\d2:\d2,\d3)'
sentence_pat = r'([^\n]*)\n'

data_pattern = re.compile(r'\n'.join([num_pat, time_pat, sentence_pat]))
print('data_pattern:', data_pattern)

for i in re.finditer(data_pattern, subtitles):
    print('-'*20)
    print(i.group(1))
    print(f'time: i.group(2) --> i.group(3)')
    print('text:', repr(i.group(4)))
    print()

我在您的代码中还注意到的一个问题是,在定义模式时,您使用的是普通字符串而不是原始字符串,并且您没有转义反斜杠。如果您想使用反斜杠而不转义,您应该使用原始字符串。希望这会有所帮助。

【讨论】:

这真的很有帮助。非常感谢你。我不习惯你曾经这样做的一些事情,但我可以看到我可以得到我想去的地方。我想使用语言处理器分析文本,然后在时间戳中返回标志。 @luka1156 只需查找正则表达式组,我想你会得到更好的理解 我可以看到您的代码非常现代,而我尝试做的一些事情已经过时了。再次感谢。 是的!现在我懂了。编译格式中的每个右括号都是一个组。您正在使用 group() 调用它们。有 4 个编译组。 没错,group(0) 将是整个匹配的字符串

以上是关于使用正则表达式从字幕格式化文本的问题的主要内容,如果未能解决你的问题,请参考以下文章

javascript中字幕的正则表达式中的可变行数

使用正则表达式 C# 解析字幕文件

记事本++中括号的正则表达式

通过正则表达式提取泰坦尼克号字幕里的所有台词

使用正则表达式中的 CSS 突出显示从文件中读取的文本的语法

正则表达式