python re模塊findall()詳解
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()詳解