gpt4 book ai didi

regex - Go:一次通过正则表达式 FindAll 和 ReplaceAll

转载 作者:IT王子 更新时间:2023-10-29 01:34:04 25 4
gpt4 key购买 nike

我正在解析网页以获取标签内的一些值,但我对标签不感兴趣,只对内容感兴趣。

我正在使用 regexp.FindAll 获取所有匹配的表达式(包括标签),然后使用 ReplaceAll 替换每个子表达式,删除标签。当然,两次运行正则表达式会花费双倍的时间,我想避免这种情况。

有没有办法同时应用这两个函数,或者等效的正则表达式?

当然,我可以创建一个函数来删除标签,但在某些情况下可能会更复杂,因为标签长度可变(如 ),而正则表达式可以解决这个问题。

此处是我的代码的一个简单示例(它不会在 Playground 上运行):http://play.golang.org/p/uGKjzmylSY

func main() {
res, err := http.Get("http://www.elpais.es")
if err != nil {
panic(err)
}

body, err := ioutil.ReadAll(res.Body)
fmt.Println("body: ", len(body), cap(body))
res.Body.Close()
if err != nil {
panic(err)
}

r := regexp.MustCompile("<li>(.+)</li>")

// Find all subexpressions, containing the label <li>
out := r.FindAll(body, -1)

for i, v := range out[:10] {
fmt.Printf("%d: %s\n", i, v)
}

//Replace to remove the label.
out2 := make([][]byte, len(out))
for i, v := range out {
out2[i] = r.ReplaceAll(v, []byte("$1"))
}

for i, v := range out2[:10] {
fmt.Printf("%d: %s\n", i, v)
}
}

顺便说一下,我知道正则表达式不能用来解析 HTML。我只对一些最里面的标签感兴趣,对结构或嵌套不感兴趣,所以我想没关系:)

最佳答案

建议:使用goquery对于该任务,使用起来非常简单,并且可以大大减少代码。示例:

doc, _ := goquery.NewDocument("http://www.elpais.es")
text := doc.Find("li").Slice(10, -1).Text()

关于您的问题,请使用 FindAllSubmatch直接提取匹配项:

r := regexp.MustCompile("<li>(.+)</li>")

// Find all subexpressions, containing the label <li>
out := r.FindAllSubmatch(body, -1)

for i, v := range out[:10] {
fmt.Printf("%d: %s\n", i, v[1])
}

关于regex - Go:一次通过正则表达式 FindAll 和 ReplaceAll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20434414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com