正则分组作用
正则分组作用,一般用于在满足整体规则基础上,对局部进行提取
正则分组语法及示例
下面我们看下其语法规则:
在正则表达式中,我们使用括号把正则进行分组
基本示例:
import re
# 这是爬虫常用的一个正则,用于提取网址
# 例如我想提取里面的网址,我们就可以使用小括号把网站部分的正则包裹起来
res = re.search(r'src=(http://.+)',"src=http://www.baidu.com/hello/")
# 如果匹配命中则 提取里面的网址
if res:
# 分组编号是从1开始的,所以我们就是group(1)
# 那么group(0) 是什么呢? 这个是我们整个的一个正则名字的字符
url = res.group(1)
上面仅仅是其基本的使用规则,好了接下来咱们看看里面的更多的内容
先看下分组编号: 编号是从1开始,然后从左到右进行编号。
看示例:
import re
# 代码后面的注释 是我们运行提取的结果
# 提取分组0
re.search(r'(\W+)(([a-z]+)(\d+)[a-z]+)(\W+)',"###abc123feg!!!").group(0) # '###abc123feg!!!
# 提取分组1
re.search(r'(\W+)(([a-z]+)(\d+)[a-z]+)(\W+)',"###abc123feg!!!").group(1) # '###'
# 提取分组2
re.search(r'(\W+)(([a-z]+)(\d+)[a-z]+)(\W+)',"###abc123feg!!!").group(2) # 'abc123feg'
# 提取分组3
re.search(r'(\W+)(([a-z]+)(\d+)[a-z]+)(\W+)',"###abc123feg!!!").group(3) # 'abc'
# 提取分组4
re.search(r'(\W+)(([a-z]+)(\d+)[a-z]+)(\W+)',"###abc123feg!!!").group(4) # '123'
# 提取分组5
re.search(r'(\W+)(([a-z]+)(\d+)[a-z]+)(\W+)',"###abc123feg!!!").group(5) #'!!!'
在上面基础上我们来一点更复杂的,当遇到有分组嵌套分组的情况
看示例:
import re
# 看下面例子 我想除了想提取整个网址外,我还想提取里面的host
src_str = "src=http://www.baidu.com/hello/"
# 正则提取
res = re.search(r'src=(http://([^/]+).+)',src_str )
# 提取group 0
print(res.group(0)) # 'src=http://www.baidu.com/hello/'
# 提取group 1
print(res.group(1)) # 'http://www.baidu.com/hello/'
# 提取group 2
print(res.group(2)) # 'www.baidu.com'
编号规则:从左向右,从外向内
除了编号以外,为了更方便我们提取,还给我们提供了一个方式 为分组起一个名字
import re
# 看下面例子 我想除了想提取整个网址外,我还想提取里面的host
src_str = "src=http://www.baidu.com/hello/"
# 正则提取 ,在分组基础上前面增加规定的格式 (?P<name>) 注意P是大写<>里面是当前分组的名字
res = re.search(r'src=(?P<url>http://(?P<host>[^/]+).+)',src_str )
# 提取所有分组内容
res.groups() # ('http://www.baidu.com/hello/', 'www.baidu.com')
# 因为我们使用别名的方式,所以我们还可以获取一个字典匹配结果
res.groupdict() # {'url': 'http://www.baidu.com/hello/', 'host': 'www.baidu.com'}