1. 程式人生 > >python re模塊findall()詳解

python re模塊findall()詳解

貪婪 可見 def d+ 分組 tro 正常 bcd 模塊

import re

string="abcdefg  acbdgef  abcdgfe  cadbgfe"

#帶括號與不帶括號的區別
#不帶括號
regex=re.compile("((\w+)\s+\w+)")
print(regex.findall(string))
#輸出:[(‘abcdefg  acbdgef‘, ‘abcdefg‘), (‘abcdgfe  cadbgfe‘, ‘abcdgfe‘)]

regex1=re.compile("(\w+)\s+\w+")
print(regex1.findall(string))
#輸出:[‘abcdefg‘, ‘abcdgfe‘]
regex2=re.compile("\w+\s+\w+") print(regex2.findall(string)) #輸出:[‘abcdefg acbdgef‘, ‘abcdgfe cadbgfe‘]

第一個 regex 中是帶有2個括號的,我們可以看到其輸出是一個list 中包含2個 tuple

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

第三個 regex 中不帶有括號,其輸出的內容就是整個表達式所匹配到的內容。

結論:findall()返回的是括號所匹配到的結果(如regex1),多個括號就會返回多個括號分別匹配到的結果(如regex),如果沒有括號就返回就返回整條語句所匹配到的結果(如regex2)。所以在提取數據的時候就需要註意這個坑。

實際上是由其並不是python特有的,這是 正則 所特有的 , 任何一門高級語言使用正則都滿足這個特點:有括號時只能匹配到括號中的內容,沒有括號【相當於在最外層增加了一個括號】。在正則裏面 “()” 代表的是分組的意思,一個括號代表一個分組,你只能匹配到"()"中的內容

===================================================================================================================

1.先說一下findall()函數的兩種表示形式

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+"第一次匹配到的字符為"2345 3456",由於是貪婪模式會 繼續匹配,第二次從"4567"開始匹配匹配到的結果為字符串"4567 5678"

import re
string="2345  3456  4567  5678"
regex=re.compile("\w+\s+\w+")
print(regex.findall(string))
#[‘2345 3456‘, ‘4567 5678‘]

首先的知道各個字符所表達的含義,這裏只說一下/s 和 /S
\s -- 匹配任何不可見字符,包括空格、制表符、換頁符等等
\S -- 匹配任何可見字符 通常[/s/S] -- 可匹配任意字符
[\s\S]*? -- 匹配懶惰模式的任意字符

2. 正則表達式中有一個括號時,其輸出的內容就是括號匹配到的內容,而不是整個表達式所匹配到的結果,但是整個正則表達式執行了只不過只輸出括號匹配到的內容, 在第一次匹配時跟上述沒有括號時一樣,匹配到 "2345 3456" ,只不過只輸出(/w+)匹配 到的結果 即"2345",第二次匹配同理從"4567" 開始,匹配到"4567 5678",但是還是只是輸出"4567"

import re
string="2345  3456  4567  5678"
regex=re.compile("(\w+)\s+\w+")
print(regex.findall(string))
#[‘2345‘,‘4567‘]

3. 當正則表達式中有兩個括號時,其輸出是一個list 中包含2個 tuple,從輸出的結果可以看出,有兩個元組,每一個元組中有兩個字符串 : 其中第一個字符串"2345 3456"是最外面的括號輸出的結果,第二個是裏面括號(/w+)輸出的結果 "2345", 第二個元組是 第二次匹配的結果 -- 詳解同第一次匹配。

import re
string="2345  3456  4567  5678"
regex=re.compile("((\w+)\s+\w+)")
print(regex.findall(string))
#[(‘2345  3456‘, ‘2345‘), (‘4567  5678‘, ‘4567‘)]

python re模塊findall()詳解