代码:
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,一些属性值可以在它<
或>
。
请不要使用`str`作为变量名称。 – 2010-11-25 06:03:10