使用R语言gsub提取商品重量时非匹配项返回原串的问题咨询
问题原因
gsub的核心规则是:只有当正则表达式完全匹配整个目标字符串时,才会执行替换操作;如果完全匹配失败,就直接返回原输入内容,不会做任何替换。- 第三个条目
"3425 Milk"末尾没有g或kg重量单位,你的正则表达式.*\\s(\\d*,*\\d+)\\s*(g|kg)$要求字符串必须以g/kg结尾,因此这条字符串完全不匹配正则规则,gsub直接返回了原字符串,而非你期望的空值或NA。
解决方法
方法1:使用stringr包的str_extract(推荐)
str_extract会直接提取符合规则的匹配内容,无匹配时自动返回NA,完全贴合预期需求:
library(stringr) bills <- c("2940 Green apples 250g", "5435 Bananas 0,5kg", "3425 Milk") str_extract(bills, "\\d*,?\\d+(?=\\s*(g|kg)$)") # 输出结果:"250" "0,5" NA
这里用**正向预查(?=...)**锁定后面跟着g/kg的数字部分,无需捕获整个字符串,逻辑更简洁。
方法2:基础R原生实现
如果不想依赖第三方包,可以先执行替换,再将未匹配的内容替换为NA/空字符串:
bills <- c("2940 Green apples 250g", "5435 Bananas 0,5kg", "3425 Milk") # 用sub即可,仅需一次替换 result <- sub(".*\\s(\\d*,?\\d+)\\s*(g|kg)$", "\\1", bills) # 将未匹配的原字符串替换为NA result[result == bills] <- NA result # 输出结果:"250" "0,5" NA
另外,正则里的\\d*,*\\d+建议改成\\d*,?\\d+,用?表示逗号最多出现一次,比*(零次或多次)更精准,避免匹配异常格式的数字。
内容的提问来源于stack exchange,提问作者LulY
相关产品推荐
相关产品推荐

