2016-03-22 3 views
1

короче: Я хочу использовать Lookahead технику в Python с ?P<name> конвенции (подробности here), чтобы получить группы по имени.= и P объединены в регулярных выражениях

больше деталей:

я обнаружил LOOKAHEAD трюк here; например следующее регулярное выражение ...

/^(?=.*Tim)(?=.*stupid).+ 

... позволяет обнаружить строки, как "Tim stupid" или "stupid Tim" порядка быть не важен.

Не могу понять, как я могу совместить ?= «оператор» с ?P; следующее регулярное выражение очевидно не делает трюк, но дает представление о том, что я хочу:

/^(?=?P<word1>.*Tim)(?=?P<word2>.*stupid).+ 
+1

Вы имеете в виду ['^ (? = (? P . * Tim)) (? = (? P . * Глупо)). +'] (Https://regex101.com/r/wW3bR3/ 1)? –

+1

@suizokukan: Группа * * захвата * - это '(...)'. '(? = ...)' являются * lookaheads *. –

ответ

1

?P<word1> в своем регулярном выражении напоминает о named capture group:

Синтаксис имени группы является одним из специфических для Python расширений: (?P<name>...). - это, очевидно, название группы. Именованные группы также ведут себя точно так же, как группы захвата, а также ассоциируют имя с группой.

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

^(?=(?P<word1>.*Tim))(?=(?P<word2>.*stupid)).+ 
    ^^^^^^^^^^ ^ ^^^^^^^^^^  ^

См regex demo

Обратите внимание, что если вам не нужна сама строка, .+ является избыточным и может быть удален. Возможно, вам захочется повторно настроить границы названных групп захвата, если это необходимо.

+1

Спасибо за все: ваши объяснения очень ясны. – suizokukan

+0

Более точно (?): '^ (? =. * (? P Tim)) (? =. * (? P глупо)). +' – suizokukan

Смежные вопросы