1. findall() 函數的2種表示形式
1 import re 2 kk = re.compile(r'\d+') 3 kk.findall('one1two2three3four4') 4 #[1,2,3,4] 5 6 #注意此處findall()的用法,可傳兩個參數; 7 kk = re.compile(r'\d+') 8 re.findall(kk,"one123") 9 #[1,2,3]
2. 正則表達式可能遇到的坑 --- 正則表達式中的括號()
1. 當正則表達式中 沒有括號時,就是正常匹配,如本例中"/w+/s+/w+"
在本例中"/w+/s+/w+"第一次匹配到的字符為"2345 3456",由於是貪婪模式會 繼續匹配,第二次從"4567"開始匹配匹配到的結果為字符串"4567 5678"
1 import re 2 string="2345 3456 4567 5678" 3 regex=re.compile("\w+\s+\w+") 4 print(regex.findall(string)) 5 #['2345 3456', '4567 5678'] 6 #補充: 7 #\s -- 匹配任何不可見字符,包括空格、制表符、換頁符等等 8 #\S -- 匹配任何可見字符 通常[/s/S] -- 可匹配任意字符 9 #[\s\S]*? -- 匹配懶惰模式的任意字符
2. 當正則表達式中有 一個括號時,如"(\w+)\s+\w+"其輸出的內容就是括號匹配到的內容
原理:正則表達式中有一個括號時,其輸出的內容就是括號匹配到的內容,而不是整個表達式所匹配到的結果,但是整個正則表達式執行了,只不過只輸出括號匹配到的內容,
匹配過程:
1. 第一次匹配時跟上述沒有括號時一樣,匹配到 "2345 3456" ,只不過只輸出(/w+)匹配 到的結果 即"2345",
2. 第二次匹配同理從"4567" 開始,匹配到"4567 5678",但是,只輸出"4567"
import re string="2345 3456 4567 5678" regex1=re.compile("(\w+)\s+\w+") print(regex1.findall(string)) #['2345', '4567']
3. 當正則表達式中有兩個括號時,如 "((\w+)\s+\w+)",其輸出結果是一個list 中包含2個 tuple
從輸出的結果可以看出,有兩個元組,每一個元組中有 兩個字符串 :
其中,第一個元組種的第一個字符串"2345 3456"是最外面的括號輸出的結果,第二個字符串是里面括號(/w+)輸出的結果 "2345",
第二個元組是 第二次匹配的結果 -- 詳解同第一次匹配。
import re string="2345 3456 4567 5678" regex2=re.compile("((\w+)\s+\w+)") print(regex2.findall(string)) #[('2345 3456', '2345'), ('4567 5678', '4567')]
3. findall() 使用總結:
第一個 regex 中不帶有括號,其輸出的內容就是整個表達式所匹配到的內容。
第二個 regex 中帶有1個括號,其輸出的內容就是括號匹配到的內容,而不是整個表達式所匹配到的結果。
第三個 regex 中是帶有2個括號的,我們可以看到其輸出是一個list 中包含2個 tuple,--- 多個括號就會返回 多個括號分別匹配到的結果
正則表達式的特點:
1. 有括號時只能匹配到括號中的內容,沒有括號就正常匹配。
2. 在正則里面 “()” 代表的是分組的意思,一個括號代表一個分組,你只能匹配到"()"中的內容