re模塊 findall()詳解

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+"其輸出的內容就是括號匹配到的內容

原理:正則表達式中有一個括號時,其輸出的內容就是括號匹配到的內容,而不是整個表達式所匹配到的結果,可是整個正則表達式執行了,只不過只輸出括號匹配到的內容,函數

匹配過程:spa

  1. 第一次匹配時跟上述沒有括號時同樣,匹配到 "2345  3456" ,只不過只輸出(/w+)匹配     到的結果 即"2345",code

  2. 第二次匹配同理從"4567" 開始,匹配到"4567  5678",可是,只輸出"4567"

blog

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

  從輸出的結果能夠看出,有兩個元組,每個元組中有   兩個字符串 :three

     其中,第一個元組種的第一個字符串"2345 3456"是最外面的括號輸出的結果,第二個字符串是裏面括號(/w+)輸出的結果 "2345",字符串

       第二個元組是  第二次匹配的結果 -- 詳解同第一次匹配。string

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 中不帶有括號,其輸出的內容就是整個表達式所匹配到的內容。class

  第二個 regex 中帶有1個括號,其輸出的內容就是括號匹配到的內容,而不是整個表達式所匹配到的結果。import

  第三個 regex 中是帶有2個括號的,咱們能夠看到其輸出是一個list 中包含2個 tuple,---  多個括號就會返回  多個括號分別匹配到的結果 

正則表達式的特色:

  1. 有括號時只能匹配到括號中的內容,沒有括號就正常匹配。

  2. 在正則裏面 「()」 表明的是分組的意思,一個括號表明一個分組,你只能匹配到"()"中的內容

相關文章
相關標籤/搜索