【Go 学习】Go 正则类似Python findall()方法

go正则

之前用Python正则提取的数据,现在想改成go来写,python正则中的findall()用的很顺手, go里面也有类似的方法 FindAllStringSubmatch

官网 https://golang.org/pkg/regexp/#Regexp.FindAllStringSubmatch

原文查看个人网站 https://www.charmcode.cn/article/2020-08-17_go_findall

方法对比

下面用示例对比下,比如写爬虫最常见的就是提取标签中的数据。
现在给出一个字符串,提取出其中h2em标签内部的数据。

测试测试<h2>h2内部数据h2111111</h2>asd<em>77ememe111</em>哈哈哈
测试测试<h2>h2内部数据h2222222</h2>asd<em>77ememe2222</em>哈哈哈
测试测试<h2>h2内部数据h23333</h2>asd<em>77emem3333</em>哈哈哈

Python findall

import re

target_str = """测试测试<h2>h2内部数据h2111111</h2>asd<em>77ememe111</em>哈哈哈
测试测试<h2>h2内部数据h2222222</h2>asd<em>77ememe2222</em>哈哈哈
测试测试<h2>h2内部数据h23333</h2>asd<em>77emem3333</em>哈哈哈
"""

result = re.findall(r"<h2>(.*?)</h2>.*?<em>(.*?)</em>", target_str)
print(result)
# 输出
# [('h2内部数据h2111111', '77ememe111'), ('h2内部数据h2222222', '77ememe2222'), ('h2内部数据h23333', '77emem3333')]

直接就能匹配返回一个包含元组的列表。

Go FindAllStringSubmatch

package main

import (
	"fmt"
	"regexp"
)

func main() {

	re := regexp.MustCompile(`<h2>(.*?)</h2>.*?<em>(.*?)</em>`)

	targetStr := `测试测试<h2>h2内部数据h2111111</h2>asd<em>77ememe111</em>哈哈哈
测试测试<h2>h2内部数据h2222222</h2>asd<em>77ememe2222</em>哈哈哈
测试测试<h2>h2内部数据h23333</h2>asd<em>77emem3333</em>哈哈哈
	`
	res := re.FindAllStringSubmatch(targetStr, -1) # -1 表示匹配次数(全部匹配)
	fmt.Println(res)
	// 输出
	// [[<h2>h2内部数据h2111111</h2>asd<em>77ememe111</em> h2内部数据h2111111 77ememe111] [<h2>h2内部数据h2222222</h2>asd<em>77ememe2222</em> h2内部数据h2222222 77ememe2222] [<h2>h2内部数据h23333</h2>asd<em>77emem3333</em> h2内部数据h23333 77emem3333]]
}

go FindAllStringSubmatch 返回的是数组嵌套数据的数据,而且内部数组第一个是匹配的整体字符串,而Python findall方法不是,如果Python findall方法也要匹配第一个为全部字符串,其实也很简单,正则全部分组就行。

result = re.findall(r"(<h2>(.*?)</h2>.*?<em>(.*?)</em>)", target_str)
# 输出
# [('<h2>h2内部数据h2111111</h2>asd<em>77ememe111</em>', 'h2内部数据h2111111', '77ememe111'), ('<h2>h2内部数据h2222222</h2>asd<em>77ememe2222</em>', 'h2内部数据h2222222', '77ememe2222'), ('<h2>h2内部数据h23333</h2>asd<em>77emem3333</em>', 'h2内部数据h23333', '77emem3333')]

总结

官方文档资料非常全。

https://golang.org/pkg/

原文地址:https://www.cnblogs.com/CharmCode/p/14191901.html