簡體   English   中英

python regex試圖匹配字符串中一組單詞的第二次出現

[英]python regex trying to match the second occurrence of a set of words in a string

我有以下字符串

test 123 Copy complete, now saving to disk (please wait)... Copy complete.test 456 Copy complete, now saving to disk (please wait)... Copy complete. test789

我正在嘗試匹配“現在保存到磁盤”的最后/ 2次出現

r'^.*now saving to disk.*(?=now saving to disk).*$'

我以為我可以使用?=向前看,讓它向前看第二次出現,但這似乎行不通。

您可以使用此正則表達式跳過文本的第一個匹配項,並匹配第二個/最后一個匹配項,

^.*(now saving to disk).*$

演示版

正如我使用的.*那樣,它以貪婪的方式捕獲任何文本,因此它僅在最后一次出現時停止,並且與文本的最后一次出現相匹配並與之匹配。

另外,您的正則表達式^.*now saving to disk.*(?=now saving to disk).*$幾乎是正確的,只是您不應該在組中使用?= ,這實際上使它成為一個前瞻性表達式而不是僅將其捕獲在您的第一組中。 因此,如果只從正則表達式中刪除?= ,那么即使您的正則表達式也可以正常工作,並且也是最佳性能選擇。

刪除?=后的正則表達式演示

解決方案1:

要獲得最后一次出現,只需使用:

^.*(now saving to disk)

點擊演示

說明:

  • ^ -斷言字符串的開頭
  • .* -盡可能匹配0+次出現的除換行符以外的任何字符。 這將帶您到字符串的末尾
  • (now saving to disk) -匹配回溯到該短語的最后一次出現並保存在組1中后, now saving to disk匹配項

解決方案2:

要獲得第二次出現,只需抓住組1中的所有內容即可:

^(?:.*?(now saving to disk)){2}

點擊演示

說明:

  • ^ -斷言字符串的開頭
  • (?:.*?(now saving to disk)){2} -匹配0+次出現的除換行符以外的任何字符,並盡可能少地匹配,然后匹配now saving to disk的短語。 重復兩次以獲取所需的短語。

解決方案3:

這是另一個正則表達式,它使用否定前瞻來確保在字符串結尾之前不再重復該短語。 這將再次獲取您now saving to disk的最后一次now saving to disk

(now saving to disk)(?!.*\1.*$)

點擊演示

說明:

  • (now saving to disk) -匹配並捕獲now saving to disk組1中的now saving to disk
  • (?!.*\\1.*$) -否定超前查詢,以確保第1組中出現的所有內容在字符串末尾之前不在字符串中出現

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM