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]
    包含完整的匹配字符串。
  • 返回值[i][1]
    包含捕获的组1
  • 返回值[i][2]
    包含捕获的组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+)+`