Проблема форматирования текста из заголовков с использованием регулярных выражений - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь получить текст заголовков для анализа, но я застрял, пытаясь получить текст субтитров в удобочитаемом виде. Я использую регулярные выражения для получения чисел подписей, времени подписей и речи. Когда дело доходит до речи, я получаю много пустых строк, потому что субтитры настроены как изображение. Итак, Я просто хочу создать список, который содержит только речь, а не пустые строки . Список, который я получаю, тоже в картинке.

Вот пример из подписи:

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

МОЙ СПИСОК

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 Ответ

0 голосов
/ 02 марта 2020

Я рекомендую вам отсканировать текст целиком, а не отдельные строки. Также вы можете использовать группы в вашем шаблоне для сбора и хранения данных. Я бы прочитал данные следующим образом:

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

Затем, используя следующий код, я бы сопоставил отдельные разделы и извлек данные:

import re

num_pat = r'(\d+)'
time_pat = r'(\d{2,}:\d{2}:\d{2},\d{3}) --> (\d{2,}:\d{2}:\d{2},\d{3})'
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()

Проблема, которую я также заметил в вашем коде в том, что при определении шаблонов вы использовали обычные строки вместо необработанных строк и не избежали обратной косой черты. Если вы хотите использовать обратную косую черту без экранирования, вы должны использовать необработанную строку. Надеюсь, это помогло.

...