代码:
str = '<br><br />A<br />B'
print(re.sub(r'<br.*?>\w$', '', str))
它应该返回<br><br />A,但它返回一个空字符串''!
有什么建议吗?
代码:
str = '<br><br />A<br />B'
print(re.sub(r'<br.*?>\w$', '', str))
它应该返回<br><br />A,但它返回一个空字符串''!
有什么建议吗?
贪婪从左到右起作用,但不是相反。它的基本意思是“除非你不匹配,否则不匹配”。这是发生了什么:
<br字符串的开头。.*?现在被忽略了,它是懒惰的。>,并成功。\w并失败。现在很有趣 - 引擎开始回溯,并看到.*?规则。在这种情况下,.可以匹配第一个>,所以该匹配仍有希望。>\w可以匹配,但$失败。再次,引擎回到惰性.*规则,并继续匹配,直到匹配<br><br />A<br />B幸运的是,有一个简单的解决方案:通过替换<br[^>]*>\w$,您不允许在标签之外进行匹配,因此它应该替换最后一个匹配项。
严格来说,这不适用于 HTML,因为标签属性可以包含 >字符,但我认为这只是一个示例。
以后不会像那样开始不贪婪。它匹配第一个<br并且将非贪婪地匹配其余部分,实际上需要转到字符串的末尾,因为您指定了$.
要使其按您想要的方式工作,请使用
/<br[^<]*?>\w$/
但通常不建议使用正则表达式来解析 HTML,因为某些属性的值可以包含<或包含>在其中。