Python re.sub использовать не жадный режим (.*?) с концом строки ( $ ) приходит жадный!
код:
str = '<br><br />A<br />B'
print(re.sub(r'<br.*?>w$', '', str))
ожидается, что он вернется <br><br />A, но он возвращает пустую строку ''!
любое предложение?
2 ответов
жадность работает слева направо, а не иначе. Это в основном означает "не совпадать, если вы не смогли соответствовать". Вот что происходит:
- двигатель regex соответствует
<brв начале строки. -
.*?пока игнорируется, он ленив. - постарайтесь, чтобы соответствовать
>, и преуспевает. - постарайтесь, чтобы соответствовать
\wи не удается. Теперь это интересно-двигатель начинает отступать, и видит.*?правило. В это дело,.могут соответствовать первому>, значит, есть еще надежда на этот матч. - это продолжается, пока регулярное выражение не достигнет косой черты. Тогда
>\wмогут соответствовать, но$не удается. Опять же, двигатель возвращается к ленивому.*правило и сохраняет соответствие, пока оно не соответствует<br><br />A<br />B
к счастью, есть простое решение: заменить <br[^>]*>\w$ не разрешить соответствие вне ваших тегов, поэтому оно должно заменить последнее происшествие.
Строго говоря, это не работает хорошо для HTML, потому что атрибуты тегов могут содержать > символов, но я предполагаю, что это просто пример.
не-жадность не начнется позже, как это. Он соответствует первому <br и не будет жадно соответствовать остальным, которые на самом деле нужно перейти в конец строки, потому что вы указываете $.
чтобы заставить его работать так, как вы хотели, используйте
/<br[^<]*?>\w$/
но обычно не рекомендуется использовать регулярное выражение для анализа HTML, так как значение некоторого атрибута может иметь < или > в нем.