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, так как значение некоторого атрибута может иметь <
или >
в нем.