Regex golang正则表达式用于提取数量对及其单位
我有一组人类可读的字符串,表示时间的持续时间。以下是四个例子:Regex golang正则表达式用于提取数量对及其单位,regex,go,Regex,Go,我有一组人类可读的字符串,表示时间的持续时间。以下是四个例子: 1 days 40 hrs 23 min 50 sec 3 hrs 1 min 30 sec 10 days 23 min 11 sec 52 sec 我正在尝试将这些字符串转换为秒数。一旦字符串被分解成它的组成部分,做这件事的数学就很简单了——它只是乘法和加法。但是,在编写正则表达式以将字符串解析为[,]对时,我遇到了一些问题。例如,我希望字符串的输出: 1天40小时23分钟50秒 数组(或切片)类似于: [[1,“天”]
1 days 40 hrs 23 min 50 sec
3 hrs 1 min 30 sec
10 days 23 min 11 sec
52 sec
我正在尝试将这些字符串转换为秒数。一旦字符串被分解成它的组成部分,做这件事的数学就很简单了——它只是乘法和加法。但是,在编写正则表达式以将字符串解析为[,]
对时,我遇到了一些问题。例如,我希望字符串的输出:
1天40小时23分钟50秒
数组(或切片)类似于:
[[1,“天”],[40,“小时”],[23,“分钟”],[50,“秒”]
下面是我到目前为止尝试过的代码及其输出(可在处执行)segs
是我的第一次尝试,它似乎将字符串分解为4个组件ok,但每个组件只是一个类似1days
的字符串,而不是一个类似[1days]
的2元素数组segs2
是我的第二次尝试,它似乎做了一些更奇怪的事情,每个组件重复两次
// time unit tokenizer
package main
import "fmt"
import "regexp"
func main() {
s := "1 days 40 hrs 23 min 50 sec"
re := regexp.MustCompile("(?P<quant>\\d+) (?P<unit>\\w+)+")
segs := re.FindAllString(s, -1)
fmt.Println("segs:", segs)
fmt.Println(segs[0], "," ,segs[1], ",", segs[2], ",", segs[3])
fmt.Println("length segs:", len(segs))
segs2 := re.FindAllStringSubmatch(s, -1)
fmt.Println("segs2:", segs2)
fmt.Println(segs2[0], "," ,segs2[1], ",", segs2[2], ",", segs2[3])
fmt.Println("length segs2:", len(segs2))
}
我已经编写了一个类似的正则表达式is Python,它工作正常,所以我真的不确定我是否对Go的正则表达式语法做了错误的操作,或者可能对re
对象进行了错误的调用。返回[]string
。但是它的内容与Python函数的返回值略有不同(我假设您在Python中使用了re.findall
)
包含完整的匹配字符串。返回值[i][0]
包含捕获的组1返回值[i][1]
包含捕获的组2李>返回值[i][2]
返回值[i]
导致打印返回值[i]
中的所有项目。(返回值[i][0]
,返回值[i][1]
,返回值[i][2]
,…)
只需打印捕获的组匹配项(不包括
[0]
),即可获得所需内容,如下所示:
segs2 := re.FindAllStringSubmatch(s, -1)
for i := 0; i < len(segs2); i++ {
fmt.Println(segs2[i][1], "," ,segs2[i][2]);
}
segs2:=re.FindAllStringSubmatch(s,-1)
对于i:=0;i
旁注 以下字符串文字:
"(?P<quant>\\d+) (?P<unit>\\w+)+"
(?P\\d+(?P\\w+)”
可以表示为以下原始字符串文本
`(?P<quant>\d+) (?P<unit>\w+)+`
`(?P\d+(-P\w+)+`
请参见Spot-on-我一直在Python中使用
re.findall
,并且一直期待类似的行为。
`(?P<quant>\d+) (?P<unit>\w+)+`