天天看點

正則比對以xx開頭以xx結尾的單詞

在字元串進行中,正規表達式是一大利器,但其對于初學者而言是存在一定的難度的。

而如何比對以xx開頭以xx結尾的單詞呢?

假設需要比對的字元串為:​

​site sea sue sweet see case sse ssee loses​

​​

需要比對的為以​​

​s​

​​開頭以​

​e​

​​ 結尾的單詞。

正确的正則式為:​​

​\bs\S*?e\b​

無論什麼語言的正則的格式都一樣,下面以python為例來進行代碼示範:

解釋一下:在python中re.findall函數表示比對字元串中所有的可能選項,findall()裡面第一個r表示row,忽略正則式中所有的轉義。

text ='site sea sue sweet see case sse ssee loses'
re.findall(r'\bs\S*?e\b',text)      

結果為:​

​['site', 'sue', 'see', 'sse', 'ssee']​

下面來解釋一下:​

​\b​

​​ 代表單詞的開始或結束,常由标點符号、空格、換行等來作為分隔符

如果前後不加​​

​\b​

​​,即正規表達式為:​

​s\S*?e​

​​

運作結果就變成了

​​

​['site', 'se', 'sue', 'swe', 'se', 'se', 'sse', 'sse', 'se']​

​​

這樣比對出來的就是不保證單詞的完整性,隻要某一個單詞中含有s*e都會輸出來。

​\S​

​​表示任意非空字元,在這個問題中很容易想到的正規表達式是​

​\bs.*?e\b​

​​ ,即将​

​\S​

​​ 寫成​

​.​

​,但是這就會導緻另外一種情況,這種情況的輸出為:

['site', 'sea sue', 'sweet see', 'sse', 'ssee']      

可以看見出現了​

​sea sue​

​ 等不是我們所期望的情況出現。

而至于​

​*​

​​ 自然是表示比對任意多個字元。

而使用​​

​\S*?​

​​ 是為什麼呢,為什麼要加​

​?​

​​ 呢?這就涉及到正規表達式的懶惰模式了。

如果使用​​

​.*​

​​ 表示的就是貪婪模式,而​

​.*?​

​​ 表示的就是懶惰模式。

貪婪模式下會盡量比對最長的字元串,而懶惰模式會盡量比對最短的字元串。

舉個栗子:

對于字元串​​

​abcgabc​

貪婪模式– ​

​a.*c​

​​ –得到的答案為:​

​abcgabc​

​​

懶惰模式– ​​

​a.*?c​

​​ –得到的答案為:​

​abc​

​​,​

​abc​

例子參考的是學習python的一個網站——​​Crossing的程式設計教室​​