python re模組findall使用

2021-09-29 19:24:36 字數 2454 閱讀 8088

今天練習re模組時候出現了乙個很奇怪的問題,同樣的正規表示式用re.search()與用re.compile().findall()匹配出來的結果不一致。

很是奇怪,故此記錄一下,防止以後碰到類似情況解決不了。

1

#!/usr/bin/env python32#

author:taoke

3import

re4 str = '

'5 pat = '

[a-za-z0-9]+://[a-za-z0-9]+\.[a-za-z0-9]+\.(com|cn)

'6 p =re.search(pat,str)

7print

(p)8 p =re.compile(pat).findall(str)

9print(len(p) , p)

執行結果:

1 d:\code\webcrawler\venv\scripts\python.exe d:/code/webcrawler/retest/retest1.py

2<_sre.sre_match object; span=(40, 60), match='

'>

3 1 ['

com']4

5 process finished with exit code 0

兩次結果並不一致。隨後到處查資料問人,後來發現一篇部落格:python re 模組 findall 函式用法簡述

介紹了re.re.compile().findall()的用法。

>>> import

re

>>> s = "

adfad asdfasdf asdfas asdfawef asd adsfas

"

>>> reobj1 = re.compile('

((\w+)\s+\w+)

')

>>>reobj1.findall(s) [('

adfad asdfasdf

', '

adfad

'), ('

asdfas asdfawef

', '

asdfas

'), ('

asd adsfas

', '

asd'

)]

>>> reobj2 = re.compile('

(\w+)\s+\w+

')

>>>reobj2.findall(s) ['

adfad

', '

asdfas

', '

asd'

]

>>> reobj3 = re.compile('

\w+\s+\w+

')

>>>reobj3.findall(s) ['

adfad asdfasdf

', '

asdfas asdfawef

', '

asd adsfas

']

按以上**例子講解:

findall函式返回的總是正規表示式在字串中所有匹配結果的列表,此處主要討論列表中「結果」的展現方式,即findall中返回列表中每個元素包含的資訊。

@1.當給出的正規表示式中帶有多個括號時,列表的元素為多個字串組成的tuple,tuple中字串個數與括號對數相同,字串內容與每個括號內的正規表示式相對應,並且排放順序是按括號出現的順序。

@2.當給出的正規表示式中帶有乙個括號時,列表的元素為字串,此字串的內容與括號中的正規表示式相對應(不是整個正規表示式的匹配內容)。

@3.當給出的正規表示式中不帶括號時,列表的元素為字串,此字串為整個正規表示式匹配的內容。

所以將我上面的正規表示式該後如下:

1

#!/usr/bin/env python32#

author:taoke

3import

re4 str = '

'5 pat = '

[a-za-z0-9]+://[a-za-z0-9]+\.[a-za-z0-9]+\.com|cn

'6 p =re.search(pat,str)

7print

(p)8 p =re.compile(pat).findall(str)

9print(len(p) , p)

執行結果如下:

1 d:\code\webcrawler\venv\scripts\python.exe d:/code/webcrawler/retest/retest1.py

2<_sre.sre_match object; span=(40, 60), match='

'>

3 1 ['

']45 process finished with exit code 0

兩次匹配的結果一致了,哈哈。

Python re 正則模組

有些字元比較特殊,它們和自身並不匹配,而是會表明應和一些特殊的東西匹配,或者它們會影響到 re 其它部分的重複次數,它們叫元字元。其中 m 和 n 是十進位制整數。該限定符的意思是至少有 m 個重複,至多到 n 個重複。舉個例子,a b 將匹配 a b a b 和 a b 它不能匹配 ab 因為沒有...

python re 模組小結

前言 本人環境windows 7 64 位,python2.7 re是什麼 regular expression縮寫,意為正規表示式,是 python 的眾多模組之一 re用途 從文字中有選擇的批量抽取想要的文字碎片 re型別 分為dfa 確定的有窮狀態自動機 和 nfa 非確定的有窮狀態自動機 r...

Python re正則模組

對於比較複雜的字串處理任務,需要依靠正規表示式。首先需要匯入 re 模組 import re常用的元字元 符號含義 匹配除 n 和 r 之外的任何單個字元。匹配字串開始位置 匹配字串結束位置 前面的元素重複0次,1次或多次 前面的元素重複0次或1次 前面的元素重複1次或多次 前面的元素出現了n次 前...