Go 正则类似Python findall()方法

go正则

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

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

方法对比

下面用示例对比下,比如写爬虫最常见的就是提取标签中的数据。 现在给出一个字符串,提取出其中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)
    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.charmcode.cn !
  目录