仰天大笑出门去,我辈岂是蓬蒿人。这篇文章主要讲述Golang: 如何使用正则表达式,并实战爬取手机号相关的知识,希望能为你提供帮助。
Golang: 如何使用正则表达式,并实战爬取手机号
众所周知,正则表达式是一个十分强大的存在,很多人接触了正则表达式后,都会感叹正则表达式竟然恐怖如斯。我们今天来聊一聊正则表达式吧!
常用正则规则
- \\d 数字
- \\D 非数字
- \\w 单词字符:大小写字母+数字+下划线
- \\W 非单词字符
- \\s 空白字符 : \\t +\\n+\\r+\\f之一
- \\S 非空白字符
- .换行符之外的任意字符
- .一个真正的点
- regan+regan表示的片段出现1到多次
- regan*regan这个片段出现0到多次
- regan?regan这个片段出现0到1次
- regan{n}regan表示的片段出现n次
- regan{m,n} regan表示的片段出现m到n次
- regan{,n} regan表示的片段出现0到n次
- [abc] a,b,c中间的任意一个字符
- [\\s\\S]习惯上表示绝对的字符,空白字符和非空白字符都行,任意字符
- [a-z] a到z中的任意一个字符
- [^abc] 除了abc外的任意字符
- regan1|regan2regan1或regan2所表示的字段
- ^regan$regan片段匹配全文 ^匹配字符串开始 $匹配字符串结尾
- regan*?,regan+?这是贪婪模式 regan*或regan+所代表的片段,使用非贪婪模式。非贪婪模式:regan*或regan+匹配的字符,越少越好。
package main
import (
"fmt"
"io/ioutil"
"net/http"
"os"
"regexp"
)
var (
rephone = `1[3456789]\\d{9}`
)
func HandleErr(err error,when string){
if err!=nil{
fmt.Println(when,err)
os.Exit(1)
}
}
func main() {
resp, err := http.Get("https://www.jihaoba.com/escrow/?& page=1")
HandleErr(err,"http.Get")
bytes, _ := ioutil.ReadAll(resp.Body)
html:= string(bytes)
//fmt.Println(html)
re := regexp.MustCompile(rephone)
allString := re.FindAllStringSubmatch(html, -1)
fmt.Println(len(allString))
fmt.Println(allString)
phone_map := make(map[string] string)
for j:=0; j< =115; j++{
phone_str := allString[j][0]
phone_map[phone_str] = phone_str
}
for i := range phone_map{
fmt.Println(phone_map[i])
}
}
上面就是利用正则表达式爬取这个网站第一页的手机号码的代码。
我们可以看到这个重中之重正则表达式:rephone = ?
?1[3456789]\\d{9}?
?,这个正则表达式的意思是第一位是一,第二位可以是三到九,后面九位为任意数字。下面来讲讲这段代码:
先是使用http.Get()去请求网站,得到响应,然后处理得到响应体,然后将响应体转化为字符串。
再使用正则表达式去响应体全文中匹配号码字符串,由于这个网站这样匹配到的内容存在重复,所以我们将得到的号码放入Map的键中用于去重。
下面再来介绍一点细节:
这个FindAllStringSubmatch()它返回第一个参数的连续匹配的片段,第一个参数是字符串,一般第二个参数n一般使用-1,如果n> = 0,则该函数最多返回n个匹配项/子匹配项。
推荐阅读
- 在一个有序数列中插入一个数重新进行排序
- [C语言] 栈内存存储方式
- 如何给运行在 SAP BTP 上的 Java 微服务增添访问控制功能
- NAT(网络地址转换)理论及配置命令
- # 聊一聊悟空编辑器 # 51CTO之悟空编辑器初体验(一个有自己名字的编辑器)
- Element-ui中 表单(Form)校验的几种形式 及 表单嵌套表格含上传(Upload)组件的
- #聊一聊悟空编辑器# 51CTO博客悟空编辑器体验
- redis | 一NoSql演进史
- 更好的 java 重试框架 sisyphus 配置的 2 种方式介绍