zoukankan      html  css  js  c++  java
  • 【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/

  • 相关阅读:
    【hihocoder 1477】闰秒
    【codeforces 768F】Barrels and boxes
    【codeforces 767E】Change-free
    【codeforces 810A】Straight «A»
    【codeforces 810B】Summer sell-off
    【codeforces 810C】Do you want a date?
    【codeforces 757E】Bash Plays with Functions
    【codeforces 749D】Leaving Auction
    Java数据结构与算法(5)
    使用Xshell远程连接管理Linux实践
  • 原文地址:https://www.cnblogs.com/CharmCode/p/14191901.html
Copyright © 2011-2022 走看看