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"}
字典取值就可以根据键值对很好的取值了