为了账号安全,请及时绑定邮箱和手机立即绑定

从无格式文本中提取多个值

从无格式文本中提取多个值

Go
千万里不及你 2022-05-23 17:45:11
我的问题是如何从这个多行文本中提取Count:, Temp:, Total:,后面的值。Used:Welcome, user [User CP]   [Count: 1,014,747.1] [some] [Ohter: 0]Temp:  14.231  Total:  10.0 TB Used:  964.57 GB  On line:  2  0 Traffic Count: 199510 (0 New)   0所以我可以得到这些值,,,1,014,747.1然后分配给一个像14.23110.0TB964.57GBstruct {    Count float64    Temp  float64    Total string    Used  string}我尝试过使用正则表达式,但它导致我需要编写四个正则表达式并使用相同的文本运行四次以逐个提取这些值。为什么我需要运行 4 次很清楚,因为我编写了 4 个 regxp 来提取 for 值。var count = regexp.MustCompile(`(?m)(Count:\s*(\d+([\,]\d+)*([\.]\d+)))`)var temp = regexp.MustCompile(`(?m)(Temp:\s*(\d+[\.]?\d*))`)var total = regexp.MustCompile(`(?m)(Total:\s*(\d+\.?\d*\s\w\w))`)var used = regexp.MustCompile(`(?m)(Used:\s*(\d+\.?\d*\s\w\w))`)// run these regexp to get values我试过使用一个正则表达式,但匹配结果包含很多空元素,我无法通过固定索引获取值。package mainimport (    "regexp"    "fmt")func main() {    var re = regexp.MustCompile(`(?m)(Count:\s*(\d+([\,]\d+)*([\.]\d+)))|(Temp:\s*(\d+[\.]?\d*))|(Total:\s*(\d+\.?\d*\s\w\w))|(Used:\s*(\d+\.?\d*\s\w\w))`)    var str = `Welcome, user [User CP]   [Count: 1,014,747.1] [some] [Ohter: 0]Temp:  14.231  Total:  10.0 TB Used:  964.57 GB  On line:  2  0 Traffic Count: 199510 (0 New)   0`    for i, match := range re.FindAllStringSubmatch(str, -1) {        fmt.Println(match, "found at index", i)    }}结果是,结果中有一些不同数量的空元素,所以我无法通过修复索引获取值。[Count: 1,014,747.1 Count: 1,014,747.1 1,014,747.1 ,747 .1      ] found at index 0[Temp:  14.231     Temp:  14.231 14.231    ] found at index 1[Total:  10.0 TB       Total:  10.0 TB 10.0 TB  ] found at index 2[Used:  964.57 GB         Used:  964.57 GB 964.57 GB] found at index 31,014,747.1在索引 2,14.231在索引 6,10.0 TB在索引 8,964.57 GB在索引 10。所以我无法通过使用固定索引来获取值。https://regex101.com/r/jenOHn/3上更清晰的子组结果,匹配信息显示了问题。那么有没有更优雅的方式来提取这些值呢?值的顺序可能会有所不同,并且在文本之间可能有一些额外的单词(或遗漏了一些单词),因此无法按计数长度进行提取。我曾考虑过使用有限状态机,但不知道如何实现它,我也不确定这是一种正确的方法。
查看完整描述

1 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

看起来你有大量的捕获组,你实际上并没有尝试捕获,还有很多不必要的指定的东西,还有一个丢失的s标志。我已经清理了表达式并且它有效: https: //play.golang.org/p/D9WxFCYQ8s0

(?ms)Count:\s*([0-9,.]+).*Temp:\s*([0-9.]+).*Total:\s*([0-9.]+).*Used:\s*([0-9.]+)


查看完整回答
反对 回复 2022-05-23
  • 1 回答
  • 0 关注
  • 228 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号