php正则式提取网页文字,Go语言使用正则表达式提取网页文本

b20820355a14c2bbdb1b1d1f9667ec7a.png

示例:在字符串 1000abcd123 中找出前后两个数字。

例子1:匹配到这个字符串的例子package main

import(

"fmt"

"regexp"

)

var digitsRegexp = regexp.MustCompile(`(\d+)\D+(\d+)`)

func main(){

someString:="1000abcd123"

fmt.Println(digitsRegexp.FindStringSubmatch(someString))

}

上面代码输出:[1000abcd123 1000 123]

例子2:使用带命名的正则表达式package main

import(

"fmt"

"regexp"

)

var myExp=regexp.MustCompile(`(?P\d+)\.(\d+).(?P\d+)`)

func main(){

fmt.Printf("%+v",myExp.FindStringSubmatch("1234.5678.9"))

}

上面代码输出,所有匹配到的都输出了:[1234.5678.9 1234 5678 9]

这里的Named capturing groups (?P) 方式命名正则表达式是 python、Go语言特有的, java、c# 是 (?) 命名方式。

例子3:对正则表达式类扩展一个获得所有命名信息的方法,并使用它。package main

import(

"fmt"

"regexp"

)

//embed regexp.Regexp in a new type so we can extend it

type myRegexp struct{

*regexp.Regexp

}

//add a new method to our new regular expression type

func(r *myRegexp)FindStringSubmatchMap(s string) map[string]string{

captures:=make(map[string]string)

match:=r.FindStringSubmatch(s)

if match==nil{

return captures

}

for i,name:=range r.SubexpNames(){

//Ignore the whole regexp match and unnamed groups

if i==0||name==""{

continue

}

captures[name]=match[i]

}

return captures

}

//an example regular expression

var myExp=myRegexp{regexp.MustCompile(`(?P\d+)\.(\d+).(?P\d+)`)}

func main(){

mmap:=myExp.FindStringSubmatchMap("1234.5678.9")

ww:=mmap["first"]

fmt.Println(mmap)

fmt.Println(ww)

}

上面代码的输出结果:map[first:1234 second:9]

1234

例子4,抓取限号信息,并记录到一个Map中。package main

import(

"fmt"

iconv "github.com/djimenez/iconv-go"

"io/ioutil"

"net/http"

"os"

"regexp"

)

// embed regexp.Regexp in a new type so we can extend it

type myRegexp struct{

*regexp.Regexp

}

// add a new method to our new regular expression type

func(r *myRegexp)FindStringSubmatchMap(s string)[](map[string]string){

captures:=make([](map[string]string),0)

matches:=r.FindAllStringSubmatch(s,-1)

if matches==nil{

return captures

}

names:=r.SubexpNames()

for _,match:=range matches{

cmap:=make(map[string]string)

for pos,val:=range match{

name:=names[pos]

if name==""{

continue

}

/*

fmt.Println("+++++++++")

fmt.Println(name)

fmt.Println(val)

*/

cmap[name]=val

}

captures=append(captures,cmap)

}

return captures

}

// 抓取限号信息的正则表达式

var myExp=myRegexp{regexp.MustCompile(`自(?P[\d]{4})年(?P[\d]{1,2})月(?P[\d]{1,2})日至(?P[\d]{4})年(?P[\d]{1,2})月(?P[\d]{1,2})日,星期一至星期五限行机动车车牌尾号分别为:(?P[\d])和(?P[\d])、(?P[\d])和(?P[\d])、(?P[\d])和(?P[\d])、(?P[\d])和(?P[\d])、(?P[\d])和(?P[\d])`)}

func ErrorAndExit(err error){

fmt.Fprintln(os.Stderr,err)

os.Exit(1)

}

func main(){

response,err:=http.Get("http://www.bjjtgl.gov.cn/zhuanti/10weihao/index.html")

defer response.Body.Close()

if err!=nil{

ErrorAndExit(err)

}

input,err:=ioutil.ReadAll(response.Body)

if err!=nil{

ErrorAndExit(err)

}

body :=make([]byte,len(input))

iconv.Convert(input,body,"gb2312","utf-8")

mmap:=myExp.FindStringSubmatchMap(string(body))

fmt.Println(mmap)

}

上述代码输出:[map[n32:0 n22:9 emonth:7 n11:3 n41:1 n21:4 n52:7 bmonth:4 n51:2 bday:9 n42:6 byear:2012 eday:7 eyear:2012 n12:8 n31:5]

map[emonth:10 n41:5 n52:6 n31:4 byear:2012 n51:1 eyear:2012 n32:9 bmonth:7 n22:8 bday:8 n11:2 eday:6 n42:0 n21:3 n12:7]

map[bday:7 n51:5 n22:7 n31:3 eday:5 n32:8 byear:2012 bmonth:10 emonth:1 eyear:2013 n11:1 n12:6 n52:0 n21:2 n42:9 n41:4]

map[eyear:2013 byear:2013 n22:6 eday:10 bmonth:1 n41:3 n32:7 n31:2 n21:1 n11:5 bday:6 n12:0 n51:4 n42:8 emonth:4 n52:9]]

更多go语言知识请关注PHP中文网go语言教程栏目。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值