Python re.sub использовать не жадный режим (.*?) с концом строки ( $ ) приходит жадный!

код:

str = '<br><br />A<br />B'
print(re.sub(r'<br.*?>w$', '', str))

ожидается, что он вернется <br><br />A, но он возвращает пустую строку ''!

любое предложение?

2 ответов


жадность работает слева направо, а не иначе. Это в основном означает "не совпадать, если вы не смогли соответствовать". Вот что происходит:

  1. двигатель regex соответствует <br в начале строки.
  2. .*? пока игнорируется, он ленив.
  3. постарайтесь, чтобы соответствовать >, и преуспевает.
  4. постарайтесь, чтобы соответствовать \w и не удается. Теперь это интересно-двигатель начинает отступать, и видит .*? правило. В это дело,. могут соответствовать первому >, значит, есть еще надежда на этот матч.
  5. это продолжается, пока регулярное выражение не достигнет косой черты. Тогда >\w могут соответствовать, но $ не удается. Опять же, двигатель возвращается к ленивому .* правило и сохраняет соответствие, пока оно не соответствует<br><br />A<br />B

к счастью, есть простое решение: заменить <br[^>]*>\w$ не разрешить соответствие вне ваших тегов, поэтому оно должно заменить последнее происшествие.
Строго говоря, это не работает хорошо для HTML, потому что атрибуты тегов могут содержать > символов, но я предполагаю, что это просто пример.


не-жадность не начнется позже, как это. Он соответствует первому <br и не будет жадно соответствовать остальным, которые на самом деле нужно перейти в конец строки, потому что вы указываете $.

чтобы заставить его работать так, как вы хотели, используйте

/<br[^<]*?>\w$/

но обычно не рекомендуется использовать регулярное выражение для анализа HTML, так как значение некоторого атрибута может иметь < или > в нем.