Go语言之正则表达式

正则表达式:Go语言标准库内建提供了regexp

一、基本介绍

基本符号:

.       匹配除换行符以外的任意字符
\w      匹配字母或数字或下划线或汉字
\s      匹配任意的空白符
\d      匹配数字
\b		匹配单词的开始或结束
^		匹配字符串的开始
$		匹配字符串的结束

数量上的约定

*			重复零次或更多次
+			重复一次或更多次
?			重复零次或一次
{n}			重复n次
{n,}		重复n次到更多次
{n,m}		重复n到m次

更为常用的

捕获(exp)			匹配exp,并捕获文本到自动命名的组里
(?<name>exp)	 匹配exp,并捕获文本到名称为name的组里,也可以写成
(?'name'exp)	 
(?:exp)			 匹配exp,不捕获匹配的文本,也不给此分组分配组号

二、基本用法

func Match(pattern string , b []byte) (matched bool , err error)

func MatchString(pattern string , s string) (matched bool , err error)

func MustCompile(str string) *Regexp

func (re *Regexp) FundAllString(s string , n int) []string

例如:

package main

import (
	"fmt"
	"regexp"
)

func main() {
	isok , _ := regexp.MatchString ("[a-zA-Z]{3}" , "zhi")
	fmt.Printf("%v" , isok)

}

返回为true。zhi是在a-zA-Z的3个字符。

// regexp
package main

import (
	"fmt"
	"regexp"
)

func main() {
	//reg := regexp.MustCompile("\\w+") 正则表达式中的\需要转义
	reg := regexp.MustCompile(`^z.*l$`)    //用``包含的字符会全部返回
	//开头是z , 结尾是l ,中间用`.*`表示中间的
    
	result := reg.FindAllString("zhangsanl", -1)
	fmt.Printf("%v\n", result)

	reg1 := regexp.MustCompile(`^z(.*)l$`)

	result1 := reg1.FindAllString("zhangsand", -1)
	fmt.Printf("%v\n", result1)

	reg2 := regexp.MustCompile(`^z(.{1})(.{1})(.*)l$`) //捕获一次,捕获一次,捕获多次

	result2 := reg2.FindAllStringSubmatch("zhangsanl", -1)
	fmt.Printf("%v\n", result2)
}

输出结果:

[zhangsanl]
[]
[[zhangsanl h a ngsan]]

进程 已完成,退出代码为 0

https://my.oschina.net/kuerant/blog/199146正则基本介绍。

三、一个简单爬虫

以名字和评分为例

// simple_crawler
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"regexp"
)

func main() {
	url := "https://movie.douban.com/subject/24751763/"
	resp, err := http.Get(url)
	if err != nil {
		panic(err)
	}

	defer resp.Body.Close()

	sHtml, _ := ioutil.ReadAll(resp.Body)

	reg := regexp.MustCompile(`<span\s*property="v:itemreviewed">(.*)</span>`)
	result := reg.FindAllStringSubmatch(string(sHtml), -1)

	fmt.Println(result[0][1])

	reg1 := regexp.MustCompile(`<strong\s*class="ll\s*rating_num"\s*property="v:average">(.*)</strong>`)
	result1 := reg1.FindAllStringSubmatch(string(sHtml), -1)

	fmt.Println(result1[0][1])
}

2021/10/10 用Goland已经爬不动豆瓣了,相同代码百度可以爬到但是豆瓣爬不到。。。

不对,经过测试感觉应该是正则表达式的问题,难道还是因为更新了以前的正则表达式不适用了?