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/

  • 相关阅读:
    枚举
    张三先唱一遍要表演的歌曲,老师觉得张三唱歌不过关,
    不断要求用户输入一个数字(假定用户输入的都是正整数
    不断要求用户输入学生姓名,输入q结束.
    要求用户输入用户名和密码,只要不是admin、888888就
    计算1到100的整数和
    c# 九九乘法表
    c#三角形
    C#循环判断密码
    什么是发动机号,发动机号码是什么?
  • 原文地址:https://www.cnblogs.com/CharmCode/p/14191901.html
Copyright © 2011-2022 走看看