re正則匹配之re.search(group groups groupdict)


 前言

re.search掃描整個字符串並返回第一個成功的匹配。re.findall返回字符串中所有不重疊匹配項的列表,如果沒有匹配到返回空list不會報錯。
search匹配對象有3個方法:group() groups() groupdict() ,這3個方法使用上會有一些差異。
如果只需匹配一個,匹配到就結束就用search,匹配全部就用findall

re.search(pattern,string,flags = 0 )

search掃描整個字符串並返回第一個成功的匹配,如果沒匹配到返回None
函數參數說明:

  • pattern 匹配的正則表達式
  • string 要匹配的字符串。
  • flags 標志位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等

 

search示例之三種基礎寫法

正則表達式前面加上r,表示原生字符串(rawstring)
import re #基礎寫法一 
kk=re.compile(r'\d+') #r表示原生字符串 result=kk.search('123abc456') print(result) #<re.Match object; span=(0, 3), match='123'>

#基礎寫法二 注意此處search()的用法,可傳兩個參數
kk=re.compile(r'\d+') result=re.search(kk,'123abc456') print(result) #<re.Match object; span=(0, 3), match='123'>

#基礎寫法三 也可以直接在search傳2個參數
result=re.search(r'\d+','123abc456') print(result) #<re.Match object; span=(0, 3), match='123'>
print(result.group()) #123

group()的使用

group(0) 是獲取取得的字符串整體,group(1)是取出括號里面我們要匹配的內容
group(0)和group()效果相同,均為獲取取得的字符串整體

group(1) 列出第一個括號匹配部分,group(2) 列出第二個括號匹配部分,group(3) 列出第三個括號匹配部分。如果沒匹配到返回的是None,調用group(1)方法會拋異常

示例1

import re # 取出url地址
a = '百度地址:www.baidu.com,歡迎使用!!!' res = re.search(r'百度地址:(.*?),歡迎', a) print(res)  # 返回match對象 <re.Match object; span=(0, 21), match='百度地址:www.baidu.com,歡迎'>
print(res.group(1)) # www.baidu.com

如果匹配到返回一個Match object對象,用group(1)取出匹配的值。

如果沒匹配到返回的是None,調用group(1)方法會拋異常

import re # 取出url地址
a = '百度地址:www.baidu.com,歡迎使用!!!' res = re.search(r'百度地址11111111:(.*?),歡迎', a) print(res)  # 返回match對象 <re.Match object; span=(0, 21), match='百度地址:www.baidu.com,歡迎'>
print(res.group(1)) # www.baidu.com

 

 如果整個字符串中,有多個值需要匹配,想同時取出,請看以下例子

import re # 取出url地址
a = '百度地址:www.baidu.com,微博地址:www.weibo.com,歡迎使用!!!' res = re.search(r'百度地址:(.*?),微博地址:(.*?),歡迎', a) print(res)  # <re.Match object; span=(0, 40), match='百度地址:www.baidu.com,微博地址:www.weibo.com,歡迎'>
print(res.group()) # 百度地址:www.baidu.com,微博地址:www.weibo.com,歡迎
print(res.group(0)) # 百度地址:www.baidu.com,微博地址:www.weibo.com,歡迎
print(res.group(1)) # www.baidu.com
print(res.group(2)) # www.weibo.com
print(res.group(0,1,2)) # ('百度地址:www.baidu.com,微博地址:www.weibo.com,歡迎使用!!!','www.baidu.com', 'www.weibo.com')

以上例子可以看出:

  • group() 跟group(0)一樣是獲取匹配的整個字符串
  • group(1) 取出匹配的第一個值
  • group(2) 取出匹配的第二個值
  • group,0,1, 2) 同時取出上面對應的2個值,返回元祖

 

groups()的使用

匹配對象的groups()方法返回一個包含所有參與匹配的子組(不含組0)的匹配到的搜索文本子串的元組。

import re # 取出url地址
a = '百度地址:www.baidu.com,微博地址:www.weibo.com,歡迎使用!!!' res = re.search(r'百度地址:(.*?),微博地址:(.+?),歡迎使用!!!', a) # 返回一個包含所有參與匹配的子組(不含組0)
print(res.groups()) #('www.baidu.com', 'www.weibo.com') # 返回匹配的group(1), group(2) 其中不含group(0)
print(res.group(1,2)) #('www.baidu.com', 'www.weibo.com')

group(0, 1, 2)可以獲取到3個值,但是group(0)我們一般不常用,一般是獲取后面兩個要取的值。
這里的groups() 的功能就是取出所有的要匹配的值,不包含group(0)

 

 groupdict() 的使用

groupdict返回一個包含所有匹配到的命名組的組名為鍵值和命名組匹配到的搜索文本子串為值作為元素的字典,且groudict僅能訪問命名組數據

import re # 取出url地址
a = '百度地址:www.baidu.com,微博地址:www.weibo.com,歡迎使用!!!' res = re.search(r'百度地址:(.*?),微博地址:(.+?),歡迎使用!!!', a) print(res.groupdict())  #返回{}

上面的匹配返回有個空的dict,因為我們沒用到變量命名匹配的內容,這種里面定義變量可以使用 ?P<variable>

import re # 取出url地址
a = '百度地址:www.baidu.com,微博地址:www.weibo.com,歡迎使用!!!' res = re.search(r'百度地址:(?P<baidu>.*?),微博地址:(?P<weibo>.+?),歡迎使用!!!', a) print(res.groupdict())  #返回 {'baidu': 'www.baidu.com', 'weibo': 'www.weibo.com'}

給要匹配的兩個值添加變量,於是就可以得到字典結果了: {"百度": "www.baidu.com", "weibo": "www.weibo.com"}
字典取值就可以根據鍵值對很好的取值了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM