Нужна помощь по извлечению текста

Рейтинг: 0Ответов: 2Опубликовано: 15.02.2023

Есть текст. Например, "Джексон: текст. Норрисон: говорит текст. еще говорит. дальше говорит. Джексон: текст. Норрисон: говорит текст. " Мне нужно вытащить все, что говорит Норрисон.

Регулярка "Норрисон:(.+?\.)", например, помогает только первое предложение взять, а нужно все что относится к персонажу.

Помогите плиз, может кто подскажет как правильно регулярное выражение составить.

Ответы

▲ 1Принят

Попробуйте воспользоваться позитивным просмотром вперед:

Норрисон:.*?(?=\.[ \t]*\S+:|\Z)

Захватываем весь текст до следующего говорящего (текст:) или конца строки \Z

▲ 0

В регулярке укажите что должна быть группа символов без двоеточий ([^:]+), заканчивающаяся на точку (\.). Вопрос после + не ставьте, иначе так и будет находить до первой точки (наименьшую группу).

Пример:

import re

text = "Джексон: текст Джексона. Норрисон: текст Норрисона. еще говорит. дальше говорит. Джексон: текст. Норрисон: опять текст Норрисона. "

result = re.findall(r"Норрисон: ([^:]+\.)", text)
print(result)

Вывод:

['текст Норрисона. еще говорит. дальше говорит.', 'опять текст Норрисона.']

Более общий вариант с извлечением имен:

import re

text = "Джексон: текст Джексона. Норрисон: текст Норрисона. еще говорит. дальше говорит. Джексон: текст. Еще текст Джексона. Норрисон: опять текст Норрисона. "

result = re.findall(r"(\w+): ([^:]+\.)", text)
print(result)

Вывод:

[('Джексон', 'текст Джексона.'), ('Норрисон', 'текст Норрисона. еще говорит. дальше говорит.'), ('Джексон', 'текст. Еще текст Джексона.'), ('Норрисон', 'опять текст Норрисона.')]