在R中如何使用正则捕获带单位的数学公式并添加括号包裹
正确实现代码
R默认正则引擎不支持零宽断言,你需要给gsub添加perl = TRUE参数启用PCRE正则规则,再搭配负向零宽后行断言排除不需要匹配的场景即可,完整实现逻辑如下:
- 先处理带逗号的小数+单位组合
- 再处理整数+单位组合,用负向断言排除前面是逗号/左大括号的场景,避免重复包裹或者拆分带逗号的数值
# 测试用例 test_str <- c("4,05g", "30g", "0,3g", "{500mgl} over {4.05grams}", "125ml 2,5kg") # 第一步:包裹所有带逗号的数字+单位组合 step1 <- gsub("(\\d+),(\\d+)([A-Za-z]+)", "{\\1,\\2\\3}", test_str, perl = TRUE) # 第二步:仅包裹前面不是逗号、也不是左大括号的整数+单位组合 result <- gsub("(?<![,{])(\\d+)([A-Za-z]+)", "{\\1\\2}", step1, perl = TRUE)
输出结果验证
运行后可以得到符合要求的结果:
"4,05g"→"{4,05g}",不会拆分逗号后数值"30g"→"{30g}",正常包裹整数带单位的内容"0,3g"→"{0,3g}",不会出现"0,{3g}"的错误- 已被大括号包裹的内容不会被重复处理
你之前写法的问题
你尝试的断言语法不符合PCRE规则:
- 负向零宽后行断言的正确写法是
(?<![排除字符]),而非你写的(?[\\.])/(!\\.?)这类格式 - 必须添加
perl = TRUE参数,R默认正则引擎不支持断言语法
内容的提问来源于stack exchange,提问作者GEX_HEX_420
相关产品推荐
相关产品推荐

