我正在编写一个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不允许我在代码块末尾添加一个空线。通常,由于线路断开(rn
或n
(,因此将存在最后一个"空"行。之后: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
(冗长(。
在此处看到它。