Пустой Regex-ответ с использованием finditer и lookahead - PullRequest
0 голосов
/ 03 января 2019

У меня проблемы с пониманием поведения регулярных выражений при использовании lookahead.

У меня есть заданная строка, в которой у меня есть два перекрывающихся шаблона (начиная с M и заканчивая p).Мой ожидаемый результат будет MGMTPRLGLESLLEp и MTPRLGLESLLEp.Мой код Python ниже приводит к двум пустым строкам, которые имеют общий старт с ожидаемым выводом.

Удаление заглядывания (?=) приводит только к ОДНОЙ выходной строке, которая является большей.Есть ли способ изменить мой термин регулярного выражения, чтобы предотвратить пустые строки, чтобы я мог получить оба результата с одним термином регулярного выражения?

import re

string = 'GYMGMTPRLGLESLLEpApMIRVA'

pattern = re.compile(r'(?=M(.*?)p)')
sequences = pattern.finditer(string)

for results in sequences:
    print(results.group())
    print(results.start())
    print(results.end())

1 Ответ

0 голосов
/ 03 января 2019

Перекрывающийся трюк с совпадением с упреждающим прогнозом использует тот факт, что паттерн (?=...) соответствует пустому месту, а затем извлекает захваченную группу, вложенную в упреждающий просмотр.

Вам необходимо распечатать группу 1, в явном виде:

for results in sequences:
    print(results.group(1))

Это приведет к:

GMTPRLGLESLLE
TPRLGLESLLE

Возможно, вы захотите включить символы M и p вгруппа захвата:

pattern = re.compile(r'(?=(M.*?p))')

, в этот момент ваш вывод становится:

MGMTPRLGLESLLEp
MTPRLGLESLLEp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...