代码:
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
。
2. .*?
暂时被忽略,因为它是懒惰的。
3. 尝试匹配>
,并成功了。
4. 尝试匹配\w
,但失败了。现在有趣了——引擎开始回溯,并看到了.*?
规则。在这种情况下,.
可以匹配第一个>
,所以仍然有希望匹配成功。
5. 这种情况会一直发生,直到正则表达式到达斜杠。然后>\w
可以匹配,但$
失败了。引擎再次回到懒惰的.*
规则,并继续匹配,直到它匹配<br><br />A<br />B
。
幸运的是,有一个简单的解决方案:通过替换<br[^>]*>\w$
,您不允许在标签外进行匹配,因此它应该替换最后一次出现的匹配。严格来说,这对于HTML并不适用,因为标记属性可能包含>
字符,但我假设这只是一个例子。非贪婪模式不会像那样晚启动。它匹配第一个<br
,并将以非贪婪方式匹配其余部分,实际上需要到字符串的末尾,因为您指定了$
。
为使其按您想要的方式工作,请使用
/<br[^<]*?>\w$/
<
或>
。
str
作为变量名。 - Chris Morgan