Соответствовать последнему вхождению имени из списка перед текстом в кавычках

Я пытаюсь получить цитаты и их соответствующих авторов в длинном тексте.

Пример: Paul […] Jane says G_quoted text_R

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

Я попробовал сделать такой положительный прогноз, но получаю все имена, а не только Джейн. Большое спасибо за вашу помощь.

i?(Paul|Jane|Robert|John)(?=[^.]*?G_(.*)_R)

https://regex101.com/r/mx0JgV/1


person user3259111    schedule 30.05.2017    source источник
comment
Зачем смотреть вперед? Требуется ли использовать текст только до Джейн и не дальше, или Джейн должна соответствовать всему регулярному выражению, а не группе, или какое-то другое странное требование?   -  person ivan_pozdeev    schedule 30.05.2017
comment
Я плохо понимаю... Если вам нужна только Джейн, зачем вы добавляете Пола и другие имена? И почему ваш цитируемый текст заключен не в (), а в G_ и _R?   -  person Sraw    schedule 30.05.2017
comment
Я хочу получить все цитаты от перечисленных авторов. В этом примере это Джейн, но в других частях текста это будут Пол, Роберт и т. д. G_ и _R изначально являются HTML-тегами ‹em› и ‹/em›, но я преобразовал их в текст   -  person user3259111    schedule 30.05.2017
comment
@ivan_pozdeev: я не уверен, что понимаю ваш вопрос. Мне нужно получить все цитаты и имена их авторов. Авторами всегда является имя, наиболее близкое к цитате. Спасибо.   -  person user3259111    schedule 30.05.2017
comment
Интересно. Lookbehind нельзя использовать, потому что движок Python, такой как PCRE, length-in-r">требует фиксированной ширины.   -  person ivan_pozdeev    schedule 30.05.2017


Ответы (1)


Что случилось с:

import re

QUOTE_FINDER = re.compile(r"(paul|jane|robert|john).*?G_(.*?)_R", re.IGNORECASE | re.DOTALL)

data = """dfdsf Jane […] Paul […] Jane says G_quoted text_R
and Paul says G_some other text_R while Robert prefers to say G_nothing_R..."""

quotes = QUOTE_FINDER.findall(data)
# [('Jane', 'quoted text'), ('Paul', 'some other text'), ('Robert', 'nothing')]
person zwer    schedule 30.05.2017
comment
Большое спасибо @zwer! Это именно то, что я искал. - person user3259111; 30.05.2017