正則匹配以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的編程教室



歡迎大家加入QQ群一起交流討論, 「吟游」程序人生——YinyouPoet


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM