正則表達式(一)

寫在前面

練習寫作是我們學習知識有效的一種方式,通過寫作可以檢驗你對知識點的掌握,是一種對自己內心世界的推演,因此你也會得到一些結論。而這些結論正是你身體力行、復盤總結、升華提煉后的結果。你把文字寫出來的時候,也許你會想,又或者會有告訴你,某本書上早寫了這些。于是你可能會茫然,想著既然書上早就寫了,那我折騰的意義在哪里?

意義很明顯。二者的區別在于,你自己想明白的,就是你的;書上的只是書上的,終究不是你的。就像高中的時候學習數學,老師在黑板上仔細的推演一道題目的解題步驟,當時你順著老師的思路聽得很明白,但是課后如果自己不再復盤一遍,那還是不能掌握知識。

所以,自己想明白的,是從你的體系中萌芽生長出來的;而從書上看到的,非常容易偷留在做個筆記畫個線,涂個手繪畫個圈,自以為懂了的層面。

正文

正則表達式是一個特殊的字符序列,一個字符串是否與我們所設定的字符序列相匹配。用正則表達式可以快速檢索文本,實現一些替換文本的操作。比如說:

例1

import re

# a = 'c|c++|Java|Python|Javascript'

a= 'c0c++7Java8Python6Javascript'

# for in循環找出數字

r= re.findall('Python',a)#一個簡單的正則表達式

print(r)#結果以列表形式出現? 規則

if len(r)> 0:

? ? print('字符串中包含Python')

else:

? ? print('No')

print(a.index('Python')>-1)

print('Python' in a)# 內置函數


(1)檢查一串數字是否是電話號碼

(2)檢查一個字符串是否符合email

(3)一個文本里的單詞替換成另一個單詞


在上述代碼中,從給定的字符串中快速檢索出要求的字符。既可以用Python的內置函數檢驗字符串中是否有要求的字符,當然最好的方法就是正則表達式,從結果可以看出,用正則表達式給出的結果會以列表的形式呈現出來。


例2

#字符集[]表示或,^表示取反;c-f(2)

import re

s= 'abc, acc, adc, aec, afc, ahc'

r= re.findall('a[^cfd]c',s)#單詞中間一個字母是c或f或d的單詞? a和c定界c-f

print(r)


字符集[],從給定的字符串序列中檢索中中間字母是c或f的單詞,將c或f填入[],并給出定界,如果需要檢索出中間字母不是c或f的單詞,只用在前面加「^」就可以實現;如果考慮中間字母不止一個,比如c到f,那么可以這樣表示[c-f]

例3

#概括字符集 比如,\d可以用0-9表示,\D取反就行;既匹配數字又匹配字母,\w(小寫)只能匹配單一字符

#.匹配除換行符\n之外其他所有字符

import re

a= 'python1111java&678php'

r= re.findall('\w',a)#\w([A-Za-z0-9_])不能匹配&;可以匹配下劃線

print(r)


概括字符集,種類很多,大家有興趣可以網上搜索一下,總結幾個常用的概括字符集。

\d可以用0-9表示;

\D表示匹配出非數字的字符,所以只用給\d取反就可以;

\w(小寫)既能匹配數字又能匹配字母,也能匹配下劃線「_」但只能匹配單一字符;

\W匹配非單詞符號&,包括空格、\n、\r、\t統稱為空白字符;

\s可以匹配空白字符,但不能盤匹配&,因為它們不屬于一類;

\S可以匹配非空白字符;

「.」匹配除換行符\n之外其他所有字符。

例4:數量詞

import re

a= 'python 1111java678php'

# r = re.findall('[a-z][a-z][a-z]',a)? ? #匹配出單詞,方法1

r= re.findall('[a-z]{3,6}',a)#方法2

print(r)


從給定的字符串中檢索出單詞。代碼中給出了兩種方法,但方法1得到的結果顯然不是我們想要的,因此我們用方法二可以得到結果。其中{3,6}就是數量詞,從給定的字符串中檢索單詞的次數。

數量詞的貪婪與非貪婪

在上述例子中,本來Python匹配到3就可以了,但是由于貪婪,還會繼續匹配,直到出現空格才算完成,其他單詞的匹配都可以用這種思想來解釋。

非貪婪只用在貪婪的數量詞后加「?」取反,例4中加入?后,與{3}是一樣的,大家可以動手驗證一下。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容