6

代码:

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

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

有什么建议吗?

4

2 回答 2

7

贪婪从左到右起作用,但不是相反。它的基本意思是“除非你不匹配,否则不匹配”。这是发生了什么:

  1. 正则表达式引擎匹配<br字符串的开头。
  2. .*?现在被忽略了,它是懒惰的。
  3. 尝试匹配>,并成功。
  4. 尝试匹配\w并失败。现在很有趣 - 引擎开始回溯,并看到.*?规则。在这种情况下,.可以匹配第一个>,所以该匹配仍有希望。
  5. 这种情况一直发生,直到正则表达式到达斜线。然后>\w可以匹配,但$失败。再次,引擎回到惰性.*规则,并继续匹配,直到匹配<br><br />A<br />B

幸运的是,有一个简单的解决方案:通过替换<br[^>]*>\w$,您不允许在标签之外进行匹配,因此它应该替换最后一个匹配项。
严格来说,这不适用于 HTML,因为标签属性可以包含 >字符,但我认为这只是一个示例。

于 2010-11-25T05:57:40.853 回答
1

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

要使其按您想要的方式工作,请使用

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

但通常不建议使用正则表达式来解析 HTML,因为某些属性的值可以包含<或包含>在其中。

于 2010-11-25T05:56:51.797 回答