Python 2.7:使用正则表达式在VTT字幕中匹配字幕事件



我正在编写一个python脚本来解析VTT字幕文件。我正在使用正则表达式来匹配和提取特定元素:

  • '在时间码中'
  • 'out timecode'
  • '其他信息'(主要是对齐信息,例如对齐:中间或行:-1(
  • 字幕内容(实际文本(

我正在使用标准库中的Python的" Re"模块,我正在寻找一种正则表达式,该表达式将与以下"字幕"事件的所有(5(匹配:

WEBVTT
00:00:00.440 --> 00:00:02.320 align:middle line:-1
Hi.
00:00:03.440 --> 00:00:07.520 align:middle line:-1
This subtitle has one line.
00:00:09.240 --> 00:00:11.080 align:middle line:-2
This subtitle has
two lines.
00:00:15.240 --> 00:00:23.960 align:middle line:-4
Now...
Let's try
four...
lines...
00:00:24.080 --> 00:00:27.080 align:middle

ps:请注意,Stackoverflow不允许我在代码块末尾添加一个空线。通常,由于线路断开(rnn(,因此将存在最后一个"空"行。之后:00:00:24.080 --> 00:00:27.080 align:middle

以下是我的代码。我的问题是,我无法弄清楚将与"字幕"事件的所有匹配的正则表达式(包括带有"副标题content"的空线的正则表达式(。

import re
import io
webvttFileObject = io.open("C:Usersjohn.doeDocumentssubtitle_sample.vtt", 'r', encoding = 'utf-8') # opens WebVTT file forcing UTF-8 encoding
textBuffer = webvttFileObject.read()
regex = re.compile(r"""(^[0-9]{2}[:][0-9]{2}[:][0-9]{2}[.,][0-9]{3})   # match TC-IN in group1
                         [ ]-->[ ]                                     # VTT/SRT style TC-IN--TC-OUT separator
                         ([0-9]{2}[:][0-9]{2}[:][0-9]{2}[.,][0-9]{3})  # match TC-OUT n group2
                         (.*)?n                                       # additional VTT info (like) alignment
                         (^.+n)+n?                                   # subtitle_content """, re.MULTILINE|re.VERBOSE)
subtitle_match_count = 0
for match in regex.finditer(textBuffer):
    subtitle_match_count += 1
    group1, group2, group3, group4 = match.groups()
    tc_in = group1.strip()
    tc_out = group2.strip()
    vtt_extra_info = group3
    subtitle_content = group4
    print "*** subtitle match count: %d ***" % subtitle_match_count
    print "TIMECODE IN".ljust(20), tc_in
    print "TIMECODE OUT".ljust(20), tc_out
    print "ALIGN".ljust(20), vtt_extra_info.strip()
    print "SUBTITLE CONTENT".ljust(20), subtitle_content
    print

我尝试了代码中的几种正则差异。一切都没有成功。对我来说,也很奇怪的是,如果我将Regex组放入变量并打印它们,就像我使用此代码一样,我只将最后一行作为SUBTITLE CONTENT。但是我一定做错了什么(对吗?(。任何帮助都非常感谢。

预先感谢。

您的正则言论与最后一个字幕不匹配的原因:

(^.+n)+n?

^.+n正在寻找具有1个或更多字符的线。但是文件中的最后一行是空的,因此它不匹配。

subtitle_content仅包含最后一行的原因。您将每行与(^.+n)+匹配,即捕获组总是仅捕获一行。对于每条匹配的行,捕获组的上一个值被丢弃了,因此最终您剩下的就是最后一行。如果您想捕获 all 行,则可以将它们全部匹配。

((?:^.+n)+)

为了使正则正则正确工作,我已经稍微更改了最后两行:

(^[0-9]{2}[:][0-9]{2}[:][0-9]{2}[.,][0-9]{3})
[ ]-->[ ]
([0-9]{2}[:][0-9]{2}[:][0-9]{2}[.,][0-9]{3})
([^n]*)?n       # replaced `.*` with `[^n]*` here because of the S-modifier
(.*?)(?:nn|Z)  # this now captures everything up to 2 consecutive
                  # newlines or the end of the string

此正则需要修饰符m(Multiline(,s(单线(,当然还有x(冗长(。

在此处看到它。

最新更新