代码:
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,因为某些属性的值可以包含<
或包含>
在其中。