正規表示式的findall函式和match函式比較

2021-09-10 05:18:31 字數 2769 閱讀 9013

findall函式返回的是正規表示式在字串中所有匹配結果的列表

我們先來看一組例子,來了解這個方法在返回匹配結果的細節。

import re

s = "abc defg hi jkl mnopq rst xyz"

regex_str_1 = "((\w+)\s+(\w+))"

res_1 = re.findall(regex_str_1,s)

print(res_1)

regex_str_2 = "(\w+)\s+\w+"

res_2 = re.findall(regex_str_2,s)

print(res_2)

regex_str_3 = "\w+\s+\w+"

res_3 = re.findall(regex_str_3,s)

print(res_3)

返回的結果如下:

res_1:

[('abc defg', 'abc', 'defg'), ('hi jkl', 'hi', 'jkl'), ('mnopq rst', 'mnopq', 'rst')]

res_2:

['abc', 'hi', 'mnopq']

res_3:

['abc defg', 'hi jkl', 'mnopq rst']

首先我們從簡單的入手,就來看看res_3的執行結果。

這個正規表示式中不包含任何括號,那麼返回的將是字串中匹配到的所有結果。正規表示式"\w+\s+\w+"匹配的結果的格式如下:a  b。我們發現字串中有三個子字串滿足這樣的要求。即:'abc defg', 'hi jkl', 'mnopq rst'。

有了以上的基礎,我們再來看下比較麻煩的res_2的執行結果。

如果乙個正規表示式中含有(),那麼返回的匹配的結果是在整個字串匹配的基礎上返回括號中匹配的子字串。比如說,我們的正規表示式是"\(w+)\s+\w+"。我們首先來看"\w+\s+\w+"匹配到的結果,也就是:'abc defg', 'hi jkl', 'mnopq rst'。在這個基礎上,因為我們的正規表示式是為了返回括號中匹配到的內容。所以,我們的結果返回的內容是:'abc', 'hi', 'mnopq'。

在res_2的基礎上,我們再看看res_1的返回結果就很簡單了。當給出的正規表示式中帶有多個括號時,返回的匹配內容中的元素為多個字串組成的tuple。這個tuple中字串個數與括號對數相同,字串內容與每個括號內的正規表示式相對應,並且排放順序是按括號出現的順序。我們發現這個正規表示式中包含了三個括號:"((\w+)\s+\w+)",毫不意外的,返回的列表元素的格式如下:(a,b,c)。a代表的是最外層括號對應的內容,b代表的是內部左邊第乙個括號對應的內容,c也就是內部右邊的那個括號對應的內容。那麼,這個正則表示返回的內容就是這樣子的:[('abc defg', 'abc', 'defg'), ('hi jkl', 'hi', 'jkl'), ('mnopq rst', 'mnopq', 'rst')]。

match()函式只會從字串的開始與正規表示式匹配,匹配成功返回將返回match object,否則返回none。

我們從**可是分析。

import re

line = "aatest1

bbtest2

cc"regex_str1 = ".*(.*

).*"

regex_str2 = ".*

"match_obj_1 = re.match(regex_str1,line)

if match_obj_1:

print(match_obj_1.group(0))

print(match_obj_1.group(1))

match_obj_2 = re.match(regex_str2,line)

if match_obj_2:

print(match_obj_2.group(0))

else:

print("can not match")

我們來看下各自執行的結果:

re.match(regex_str1,line).group(0):

aatest1

bbtest2

ccre.match(regex_str1,line).group(1):

test2

match_obj_2 = re.match(regex_str2,line):

can not match

我們來依次分析執行結果:

match如果匹配成功將會返回match object,我們可以呼叫group()方法進行獲取。當使用group(0)來獲取內容的時候,將會返回的是正規表示式中不包含括號所匹配到的內容。即將根據".*.*

.*"來匹配到的內容,匹配的結果如下:aatest1

bbtest2

cc。當然,如果group(1)來獲取內容的時候,將會在不包含括號的進行匹配的基礎上獲取括號中的匹配到的內容。在該例子中,我們匹配到不包含括號的內容是aatest1

bbtest2

cc,然後我們根據是否是貪婪模式(此處是貪婪模式)來獲取括號中匹配到的內容,即:test2

。另外,match()函式只會從字串的開始與正規表示式匹配,匹配成功返回將返回match object,否則返回none。對於,".*

"正規表示式中,我們將會檢視字串line = "aatest1

bbtest2

cc"是否是從開頭的,顯然不是,那麼也就意味著我們沒有匹配到內容,返回none。

python 正規表示式 findall

import re s adfad asdfasdf asdfas asdfawef asd adsfas reobj1 re.compile w s w print reobj1.findall s adfad asdfasdf adfad asdfas asdfawef asdfas asd a...

正規表示式 正規表示式函式 筆記

筆記直接使用pycharm製作,需要原始檔請私聊。正規表示式函式 1.match 2.search 3.全域性匹配函式 全域性匹配 re.compile 正規表示式 findall 資料 import re string poythonydasadcasa pat2 p.y 懶惰模式執行 較精準 r...

正規表示式函式

正規表示式函式 函 數 說 明 regexp like x,pattern match option 從x中搜尋pattern引數中定義的正規表示式。可以使用match option修改預設匹配選項,該引數可以被設定為 c 說明在匹配時區分大小寫 預設選項 i 說明在匹配時不區分大小寫 n 允許使用...