GO手写网络爬虫二(正则表达式匹配)

本篇主要演示一下GO用正则表达式匹配文本信息的用法,为后面的爬虫做准备工作:

代码中已有详细的注释,直接贴上可执行的代码:

package main

import (
	"fmt"
	"regexp"
)

const text  = `arno's email is arno.wang@gmail.com
				lisa's email is lisa.li@163.com
				lucas's email is lucas.liu@kii.com
				alfred's email is alfred@sina.com.cn
`
func main() {
	//正则表达式解析
	//[0-9a-zA-Z]   表示0-9或a-z或A-Z中的一个或多个字符
	//[0-9a-zA-Z]+  表示一个或多个

	//@[0-9a-zA-Z]+  表示一个@与0-9或a-z或A-Z中的一个或多个字符
	//\.             表示 . 因为.是正则保留字符,它表示任意字符,如果想用来单纯的表示字符.  , 需要用转意符\
	r := regexp.MustCompile(`[0-9a-zA-Z]+@[0-9a-zA-Z]+\.[0-9a-zA-Z]+`)

	//匹配所有满足正则的文本
	matchs := r.FindAllString(text,-1)
	fmt.Println("match list 1 : ",matchs)


	//alfred@sina.com.cn这里输出有点问题,把.cn给漏掉了
	//分析,应该允许@后面重复出现   [0-9a-zA-Z.]+  并以 \.[0-9a-zA-Z]+ 结尾似乎就满足我们的需求了,现试一下吧
	r = regexp.MustCompile(`[0-9a-zA-Z]+@[0-9a-zA-Z.]+\.[0-9a-zA-Z]+`)
	matchs = r.FindAllString(text,-1)
	fmt.Println("match list 2 : ",matchs)

	//只想提取邮件的名称怎么办呢?
	//分两步: 1,把想提取的子串用()给括起来 ; 2,用r.FindAllStringSubmatch(text,-1)来匹配
	r = regexp.MustCompile(`([0-9a-zA-Z]+)@([0-9a-zA-Z.]+\.[0-9a-zA-Z]+)`)
	subMatchs := r.FindAllStringSubmatch(text,-1)
	fmt.Println("subMatch list 2 : ",subMatchs)

	//匹配一个满足正则表达式的词
	match := r.FindString(text)
	fmt.Println(match)
}

正则好用且强大,功能远不止于本篇所介绍的这些,本爬虫也主要利用正则表达式来完成网页的解析工作。
更多正则表达式语法参见:http://www.runoob.com/regexp/regexp-tutorial.html

另外说明一下,GO有一些开源的爬虫框架的,但是这里用框架来实现就失去了很多趣味性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值