正則匹配中的非貪婪匹配不是最短匹配

2021-10-08 01:23:46 字數 780 閱讀 2619

最近在工作中遇到乙個需求,就是找出html中所有錨文字包含****的超連結。剛開始我寫了乙個很簡單的正則來解決這個問題這要從正則匹配的原理說起,簡單的來說正則匹配是一種貪心的演算法。它總是先找到第乙個匹配的位置,然後向後繼續匹配其他的表示式符號。對於本文給出的正規表示式,會現在html中找到乙個對於這個任務,我後來使用了其他效率更高的方法實現了,但是有沒有可能使用正規表示式來完成這個任務呢?

零寬斷言是一種零寬度的匹配,它匹配到的內容不會儲存到匹配結果中去,最終匹配結果只是乙個位置而已。

作用是給指定位置新增乙個限定條件,用來規定此位置之前或者之後的字元必須滿足限定條件才能使正則中的字表示式匹配成功。

零寬斷言總共有四種

對於這個需求,實際上應該找到離****最近的乙個非捕獲組來去除不需要的匹配,最終可以將整個表示式寫成

可以看到匹配的範圍已經縮小到最後乙個出現的超連結。

因為正規表示式實現原理的限制,儘管選擇非貪婪匹配,匹配到的結果也不一定是最短的匹配。

通常正規表示式總是表明了「要匹配什麼」,而通過零寬度負斷言,則可以表明「不匹配什麼」,這比字符集中使用^來取反更加強大。

正則非貪婪匹配

string str 註冊商 xiamen ename network technology corporation limited dba ename corp,網域名稱伺服器 whois.ename.com,相關 dns 伺服器 ns1.ename.net,dns 伺服器 ns2.ename.n...

re 正則匹配的非貪婪匹配

非貪婪匹配 將盡可能少的匹配內容,當?出現在其他的重複次數後面時會將貪婪模式改為非貪婪模式。如 abc.abc.非貪婪匹配 盡可能少的匹配?號表示 號前面的字元出現0 無數個 號表示最少匹配 號表示 號前面的字元出現1 無數個 表示0 1個 print re.findall r ab aababba...

貪婪匹配和非貪婪匹配

貪婪模式 在整個表示式匹配成功的前提下,盡可能多的匹配 非貪婪模式 在整個表示式匹配成功的前提下,盡可能少的匹配 重複匹配0次或1次 重複匹配0次或更多次 重複匹配1次或更多次 預設情況下是貪婪的!content abbbbc pattern re.compile r ab result patte...