使用正则表达式从字幕格式化文本的问题
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) 将是整个匹配的字符串以上是关于使用正则表达式从字幕格式化文本的问题的主要内容,如果未能解决你的问题,请参考以下文章