在字元串進行中,正規表達式是一大利器,但其對于初學者而言是存在一定的難度的。
而如何比對以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的程式設計教室