强制正则表达式在正则表达式的开头和结尾完全匹配可选组

How to force regex to match for optional groups at the beginning and the end of the regex. Example:

(keyword1)*\W*(?:\w+\W+){0,6}(keyword2)\W*(?:\w+\W+){0,6}(keyword3)*

Here keyword1 and keywrod3 are at the start and the end of the regex respectively and are optional. I am looking for keyword1, keyword2 and keyword3 in this order.We can have up to 6 words between keywords but the matched string should start by one keyword and end by one of the keywords. No extra string is needed. Is there a way to do that. Any suggestion is welcome. Here is a code and a link to Go Playground:

package main

import (
    "fmt"
    "regexp"
)

func main() {
    //here ok as exact match. The matched string starts by one of the keyword and ends by one of them. 
    re := regexp.MustCompile(`(keyword1)\W*(?:\w+\W+){0,6}(keyword2)\W*(?:\w+\W+){0,6}(keyword3)`)
    text := "start text keyword1 optional word here then keyword2 again optional words then keyword3 others words after."
        s := re.FindAllString(text, -1)
    fmt.Println(s)

    //Here not exact match as the result doesn't start by keyword1 and end by keyword3
    re = regexp.MustCompile(`(keyword1)*\W*(?:\w+\W+){0,6}(keyword2)\W*(?:\w+\W+){0,6}(keyword3)*`)
    text = "start text keyword1 optional word then keyword2 optional words keyword3 others words after."
    s = re.FindAllString(text, -1)
    fmt.Println(s)
}

Thanks