re正则匹配之re.search(group groups groupdict)
前言
re.search掃描整個(gè)字符串并返回第一個(gè)成功的匹配。re.findall返回字符串中所有不重疊匹配項(xiàng)的列表,如果沒(méi)有匹配到返回空l(shuí)ist不會(huì)報(bào)錯(cuò)。
search匹配對(duì)象有3個(gè)方法:group() groups() groupdict() ,這3個(gè)方法使用上會(huì)有一些差異。
如果只需匹配一個(gè),匹配到就結(jié)束就用search,匹配全部就用findall
re.search(pattern,string,flags = 0 )
search掃描整個(gè)字符串并返回第一個(gè)成功的匹配,如果沒(méi)匹配到返回None
函數(shù)參數(shù)說(shuō)明:
pattern 匹配的正則表達(dá)式
string 要匹配的字符串。
flags 標(biāo)志位,用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等
search示例之三種基礎(chǔ)寫法
正則表達(dá)式前面加上r,表示原生字符串(rawstring)
import re
#基礎(chǔ)寫法一
kk=re.compile(r'd+') #r表示原生字符串
result=kk.search('123abc456')
print(result) #<re.Match object; span=(0, 3), match='123'>
#基礎(chǔ)寫法二 注意此處search()的用法,可傳兩個(gè)參數(shù)
kk=re.compile(r'd+')
result=re.search(kk,'123abc456')
print(result) #<re.Match object; span=(0, 3), match='123'>
#基礎(chǔ)寫法三 也可以直接在search傳2個(gè)參數(shù)
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)是取出括號(hào)里面我們要匹配的內(nèi)容
group(0)和group()效果相同,均為獲取取得的字符串整體
group(1) 列出第一個(gè)括號(hào)匹配部分,group(2) 列出第二個(gè)括號(hào)匹配部分,group(3) 列出第三個(gè)括號(hào)匹配部分。如果沒(méi)匹配到返回的是None,調(diào)用group(1)方法會(huì)拋異常
示例1
import re # 取出url地址 a = '百度地址:www.baidu.com,歡迎使用!!!' res = re.search(r'百度地址:(.*?),歡迎', a) print(res) # 返回match對(duì)象 <re.Match object; span=(0, 21), match='百度地址:www.baidu.com,歡迎'> print(res.group(1)) # www.baidu.com
如果匹配到返回一個(gè)Match object對(duì)象,用group(1)取出匹配的值。
如果沒(méi)匹配到返回的是None,調(diào)用group(1)方法會(huì)拋異常
import re # 取出url地址 a = '百度地址:www.baidu.com,歡迎使用!!!' res = re.search(r'百度地址11111111:(.*?),歡迎', a) print(res) # 返回match對(duì)象 <re.Match object; span=(0, 21), match='百度地址:www.baidu.com,歡迎'> print(res.group(1)) # www.baidu.com
如果整個(gè)字符串中,有多個(gè)值需要匹配,想同時(shí)取出,請(qǐng)看以下例子
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)一樣是獲取匹配的整個(gè)字符串
group(1) 取出匹配的第一個(gè)值
group(2) 取出匹配的第二個(gè)值
group,0,1, 2) 同時(shí)取出上面對(duì)應(yīng)的2個(gè)值,返回元祖
groups()的使用
匹配對(duì)象的groups()方法返回一個(gè)包含所有參與匹配的子組(不含組0)的匹配到的搜索文本子串的元組。
import re
# 取出url地址
a = '百度地址:www.baidu.com,微博地址:www.weibo.com,歡迎使用!!!'
res = re.search(r'百度地址:(.*?),微博地址:(.+?),歡迎使用!!!', a)
# 返回一個(gè)包含所有參與匹配的子組(不含組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個(gè)值,但是group(0)我們一般不常用,一般是獲取后面兩個(gè)要取的值。
這里的groups() 的功能就是取出所有的要匹配的值,不包含group(0)
groupdict() 的使用
groupdict返回一個(gè)包含所有匹配到的命名組的組名為鍵值和命名組匹配到的搜索文本子串為值作為元素的字典,且groudict僅能訪問(wèn)命名組數(shù)據(jù)
import re
# 取出url地址
a = '百度地址:www.baidu.com,微博地址:www.weibo.com,歡迎使用!!!'
res = re.search(r'百度地址:(.*?),微博地址:(.+?),歡迎使用!!!', a)
print(res.groupdict()) #返回{}
上面的匹配返回有個(gè)空的dict,因?yàn)槲覀儧](méi)用到變量命名匹配的內(nèi)容,這種里面定義變量可以使用?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'}
給要匹配的兩個(gè)值添加變量,于是就可以得到字典結(jié)果了:{"百度": "www.baidu.com", "weibo": "www.weibo.com"}
字典取值就可以根據(jù)鍵值對(duì)很好的取值了
總結(jié)
以上是生活随笔為你收集整理的re正则匹配之re.search(group groups groupdict)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python os操作
- 下一篇: 洛谷模板,树状数组二 差分