Python re.sub使用非贪婪模式(.*?)和字符串结尾($)它变得贪婪!

Jet*_*Guo 6 python regex regex-greedy

码:

str = '<br><br />A<br />B'
print(re.sub(r'<br.*?>\w$', '', str))
Run Code Online (Sandbox Code Playgroud)

它应该返回<br><br />A,但它返回一个空字符串''!

有什么建议吗?

Kob*_*obi 6

贪婪从左到右,但不是.它基本上意味着"除非你没有匹配,否则不匹配".这是发生了什么:

  1. 正则表达式引擎<br在字符串的开头匹配.
  2. .*? 现在被忽略了,很懒.
  3. 尝试匹配>,并成功.
  4. 尝试匹配\w并失败.现在它很有趣 - 引擎开始回溯,并看到.*?规则.在这种情况下,.可以匹配第一个>,所以仍然希望这场比赛.
  5. 这种情况一直持续到正则表达式达到斜线.然后>\w可以匹配,但$失败了.同样,引擎回到懒惰.*规则,并保持匹配,直到它匹配<br><br />A<br />B

幸运的是,有一个简单的解决方案:通过替换<br[^>]*>\w$不允许在你的标签之外进行匹配,所以它应该替换最后一次出现.
严格地说,这对HTML不起作用,因为标签属性可以包含 >字符,但我认为它只是一个例子.