Как подобрать самый длинный узор

Как мне изменить следующее, чтобы оно соответствовало abbb вместо того, чтобы просто остановиться на ab?

>>> re.match('ab|abb|abbb', 'abbb')
<re.Match object; span=(0, 2), match='ab'>

2 ответа

Вы можете использовать:

re.match('ab(b(b)?)?', 'abbb')
<_sre.SRE_Match object; span=(0, 4), match='abbb'>

В ? здесь означает, что предыдущий элемент является необязательным, но он жадный, поэтому элемент будет включен в соответствие, если это возможно (ленивый эквивалент ??).

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

re.match('ab(bb?)?', 'abbb')

Сказанное выше не зависит от того, что b повторяется в шаблоне, например, вы могли бы аналогичным образом иметь:

re.match('ab(c(d)?)?', 'abcd')
<_sre.SRE_Match object; span=(0, 4), match='abcd'>

Однако, если на самом деле вам не требуется универсальность этого подхода, вы можете вместо этого использовать следующее, чтобы сопоставить a затем следуют от 1 до 3 bs:

re.match('ab{1,3}', 'abbb')
<_sre.SRE_Match object; span=(0, 4), match='abbb'>

Опять же, {1,3}квантификатор является жадным, поэтому будет соответствовать как можно большему количеству. (Ленивый эквивалент{1,3}?.)

Это зависит от порядка ваших выкроек. Пытаться

re.match('abbb|abb|ab', 'abbb')
Другие вопросы по тегам