正則匹配以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)
- 1
- 2
結果為:['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']
- 1
可以看見出現了sea sue
等不是我們所期望的情況出現。
而至於*
自然是表示匹配任意多個字元。
而使用\S*?
是為什麼呢,為什麼要加?
呢?這就涉及到正則表示式的懶惰模式了。
如果使用.*
表示的就是貪婪模式,而.*?
表示的就是懶惰模式。
貪婪模式下會盡量匹配最長的字串,而懶惰模式會盡量匹配最短的字串。
舉個栗子:
對於字串abcgabc
貪婪模式– a.*c
–得到的答案為:abcgabc
懶惰模式– a.*?c
–得到的答案為:abc
,abc
--------------------- 本文來自 _吟遊詩人 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/qq_32623363/article/details/78808132?utm_source=copy