Сначала ищите, а затем ищите ближайшую совпадающую группу захвата за совпадением.RegEx в Python - PullRequest
0 голосов
/ 17 декабря 2018

У меня полный текст со строками, разделенными строками.Строки, начинающиеся с «%», - это заголовки, а строки, начинающиеся с «>», содержат текст, в котором я хочу найти свой запрос. Если мой запрос найден, я хочу вернуть ближайший заголовок над ним.Вот выражение, которое я попробовал сам:

import re
query = "ABCDE"
full_text = "%EFGHI\r>XXXXX\r>XXXXX\r%IWANT\r>XXXXX\r>ABCDE"
re.search("%(.*?)\r(?=>.*{})".format(query), full_text).group(0)

Я хочу, чтобы этот блок кода возвращал строку:

> 'IWANT'

Поскольку это ближайший заголовок над запросом.Однако он возвращает:

> 'EFGHI'

Я думаю, это имеет смысл, поскольку 'EFGHI' - первый элемент, соответствующий шаблону поиска.Есть ли способ сначала посмотреть на мой запрос, а затем вернуться к ближайшему названию?

1 Ответ

0 голосов
/ 17 декабря 2018

Я предлагаю сопоставить все детали с \r>..., которые не имеют % после \r перед значением ABCDE, чтобы получить правильный заголовок:

r"%([^\r]*)(?=(?:\r(?!%)[^\r]*)*\r>[^\r]*{})".format(query)

См. Демонстрационную версию Python

Детали шаблона :

  • % - % char
  • ([^\r]*) - Группа 1: нольили больше символов, отличных от символов CR
  • (?=(?:\r(?!%)[^\r]*)*\r>[^\r]*ABCDE) - положительный прогноз, который непосредственно справа от текущего местоположения должен соответствовать следующей последовательности шаблонов:
    • (?:\r(?!%)[^\r]*)* - 0или больше повторений CR, за которыми не следует %, а затем следует ноль или более символов, отличных от символов CR
    • \r> - символ CR и >
    • [^\r]* -ноль или более символов, кроме символов CR
    • ABCDE - буквенная последовательность символов
...