2010-11-25 128 views
5

代码:

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

预计返回<br><br />A,但它返回一个空字符串''

有什么建议吗?

+2

请不要使用`str`作为变量名称。 – 2010-11-25 06:03:10

回答

6

贪婪从左到右工作,但没有其他方式。它基本上意味着“不匹配,除非你不匹配”。以下是发生了什么事情:

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

幸运的是,有一个简单的解决方案:通过更换<br[^>]*>\w$你不让你的标签之外匹配,所以它应该取代最后一次出现。
严格来说,这对HTML并不适用,因为标签属性可以包含>个字符,但我认为这只是一个示例。

1

非贪心不会像以后那样开始。它与第一个<br相匹配,并且将非贪婪地匹配其余部分,因为您指定$,实际上需要转到字符串的末尾。

为了使它工作,你想要的方式,使用

/<br[^<]*?>\w$/ 

但通常不建议使用正则表达式来解析HTML,一些属性值可以在它<>