揭祕match(), search(), finall()的區別,廢話不多說,看代碼
一、先看後解釋
import re
str = 'python是世界上最美的語言!我愛你中國!'
# match的使用
str_match1 = re.match(r'世界(.*)!', str)
print(str_match1) # 結果返回None
str_match2 = re.match(r'python(.*)!', str)
print(str_match2.span()) # 返回(0, 22)
print(str_match2.group()) # 返回 python是世界上最美的語言!我愛你中國!
# search的使用
str_search1 = re.search(r'世界(.*)!', str)
print(str_search1.group()) # 返回 世界上最美的語言!我愛你中國!
# search(.*?)的使用對比
str_search2 = re.search(r'世界(.*?)!', str)
print(str_search2.group()) # 返回 世界上最美的語言!
# finall()的使用
str_findall1 = re.findall(r'(.*?)!', str)
print(str_findall1) # 返回 ['python是世界上最美的語言', '我愛你中國']
str_findall2 = re.findall(r'(.*)!', str)
print(str_findall2) # 返回 ['python是世界上最美的語言!我愛你中國']
二、解釋
-
math(),是從頭進行匹配,匹配到返回一個對象,若匹配不到返回None。
舉例:str = 'python是**世界**上最美的語言!我愛你中國!' str_match1 = re.match(r'**世界**(.*)!', str) **世界**並不是str開頭的字符串,所以用match匹配不到,所以str_match1返回了**None** str_match2 = re.match(r'**python**(.*)!', str) print(str_match2.group()) **python**是str開頭的字符串且有字符串內含有感嘆號,故可以進行匹配操作 匹配後返回的是一個對象格式,如果想取出對象對應的數據需要用group()這個方法 str_match2.group(),最後得到匹配的字符串是: **python是世界上最美的語言!我愛你中國!**
-
search(),是僅返回第一個匹配 ,匹配到會返回一個對象,若匹配不到會返回一個None。
舉例:str_search1 = re.search(r'世界(.*)!', str) 匹配以'世界'開頭並且以‘!’,在str中存在的文字信息內容 print(str_search1.group()) # 返回 世界上最美的語言!我愛你中國!
-
findall(), 是返回所有匹配到的字符串,並以列表的形式進行返回,若沒有匹配到則返回空列表。
舉例:str_findall1 = re.findall(r'(.*?)!', str) print(str_findall1) 返回 ['python是世界上最美的語言', '我愛你中國'] 列表形式進行返回!
備註:findall(),只返回(.*)或者(.*?)中匹配的內容,返回的值中不包含外層匹配的文字內容
-
(.*)和(.*?)的區別
解釋:(.\*)是貪婪匹配,會盡量多匹配符合規則的內容信息 (.\*?) 是非貪婪匹配,會盡量少的匹配符合規則的內容信息(可能說的太官方了) 舉例: str_findall1 = re.findall(r'(.*?)!', str) print(str_findall1) # 返回 ['python是世界上最美的語言', '我愛你中國'] str_findall2 = re.findall(r'(.*)!', str) print(str_findall2) # 返回 ['python是世界上最美的語言!我愛你中國'] 這個匹配規則是 匹配str這個字符串中所有以 ‘!’結尾的內容,返回兩個內容確不相同 str_findall1 列表中有兩個數據,str_findall2列表中有一個數據 (.\*?)會盡量少的匹配,當它進行匹配的時候,發現字符串中有一個!就返回一個結果。 (.\*) 會盡量多的去匹配,必須匹配到最後一個!爲止纔會返回結果。