Честно говоря, я не вижу причин использовать регулярное выражение для решения этой проблемы. .srt
файлы хорошо структурированы. Структура выглядит так:
- целое число, начинающееся с 1, монотонно возрастающее
- начать --› остановить отсчет времени
- одна или более строка содержания субтитров
- пустая строка
... и повторить. Обратите внимание на выделенную жирным шрифтом часть — возможно, вам придется захватить 1, 2 или 20 строк содержимого субтитров после тайм-кода.
Итак, просто воспользуйтесь структурой. Таким образом, вы можете анализировать все за один проход, не помещая в память более одной строки за раз и сохраняя всю информацию для каждого субтитра вместе.
from itertools import groupby
# "chunk" our input file, delimited by blank lines
with open(filename) as f:
res = [list(g) for b,g in groupby(f, lambda x: bool(x.strip())) if b]
Например, используя пример на странице документа SRT, я получаю:
res
Out[60]:
[['1\n',
'00:02:17,440 --> 00:02:20,375\n',
"Senator, we're making\n",
'our final approach into Coruscant.\n'],
['2\n', '00:02:20,476 --> 00:02:22,501\n', 'Very good, Lieutenant.\n']]
И я мог бы далее преобразовать это в список значимых объектов:
from collections import namedtuple
Subtitle = namedtuple('Subtitle', 'number start end content')
subs = []
for sub in res:
if len(sub) >= 3: # not strictly necessary, but better safe than sorry
sub = [x.strip() for x in sub]
number, start_end, *content = sub # py3 syntax
start, end = start_end.split(' --> ')
subs.append(Subtitle(number, start, end, content))
subs
Out[65]:
[Subtitle(number='1', start='00:02:17,440', end='00:02:20,375', content=["Senator, we're making", 'our final approach into Coruscant.']),
Subtitle(number='2', start='00:02:20,476', end='00:02:22,501', content=['Very good, Lieutenant.'])]
person
roippi
schedule
12.05.2014
`
) вместо кавычек (>
)? Кроме того, можете ли вы показать часть кода Python, использующего это регулярное выражение? - person   schedule 13.05.2014