2010-11-25 53 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,一些屬性值可以在它<>