Go与Python正则re匹配行为差异及Go对齐Python输出方案问询
差异原因
- Go的
regexp.FindAll系列方法默认返回整个正则表达式的完整匹配结果,不会自动提取捕获组内容。你所用的正则(?:^|_)(.)的完整匹配结果包含非捕获组匹配到的_或者开头定位,因此输出会携带下划线。 - Python的
re.findall在正则包含捕获组时,会优先返回所有捕获组的匹配值,你示例中仅定义了1个捕获组(.),因此直接返回该分组的匹配结果,自动过滤了非捕获组的内容。
解决方案
要拿到和Python一致的捕获组内容,需要使用Go正则的**子匹配(Submatch)**相关方法,示例代码如下:
package main import ( "fmt" "regexp" ) func main() { re := regexp.MustCompile(`(?:^|_)(.)`) matches := re.FindAllSubmatch([]byte("i_love_golang_and_json_so_much"), -1) res := make([]string, 0, len(matches)) for _, match := range matches { // match[0]为整个正则的完整匹配内容,match[1]对应第一个捕获组的匹配结果 res = append(res, string(match[1])) } fmt.Printf("%q", res) }
运行上述代码输出结果为:["i" "l" "g" "a" "j" "s" "m"],和Python的输出完全一致。
内容的提问来源于stack exchange,提问作者buxizhizhoum
相关产品推荐
相关产品推荐

