Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-使用gregexpr从字符串中提取多个模式_R_Regex - Fatal编程技术网

R-使用gregexpr从字符串中提取多个模式

R-使用gregexpr从字符串中提取多个模式,r,regex,R,Regex,我正在使用一个数据集,其中有一列描述不同的产品。在产品描述中还有产品的重量,这是我想提取的。我的问题是有些产品是双包装的,这意味着描述以“2x”开头,而实际重量在描述的末尾。例如: x = '2x pet food brand 12kg' 我想做的是把它缩短到2x12kg。 我不擅长在R中使用regexp,希望这里的人能帮助我 我已尝试通过以下方式使用gregexp进行此操作: m <- gregexpr("(^[0-9]+x [0-9]+kg)", x) 我曾尝试在gsub中使用或声

我正在使用一个数据集,其中有一列描述不同的产品。在产品描述中还有产品的重量,这是我想提取的。我的问题是有些产品是双包装的,这意味着描述以“2x”开头,而实际重量在描述的末尾。例如:

x = '2x pet food brand 12kg'
我想做的是把它缩短到2x12kg。 我不擅长在R中使用regexp,希望这里的人能帮助我

我已尝试通过以下方式使用gregexp进行此操作:

m <- gregexpr("(^[0-9]+x [0-9]+kg)", x)
我曾尝试在gsub中使用或声明,例如:

m <- gsub('^([0-9]+x)?[^0-9]*([0-9.]+kg)|([0-9]+x)?[^0-9]*([0-9.]+g)', '\\1\\2', x)
#And
m <- gsub('^([0-9]+x)?[^0-9]*([0-9.]+(kg|g)), x)
或使用以下命令再次运行gsub:

m <- gsub('([0-9]+x[0-9]+g)', '\\1', x)
后一个选项根本不提取产品权重,只保留字符串不变


很抱歉,没有注意到前面的字符串格式不同。再次感谢您的帮助。

编辑以更正@R.Schifini指出的错误

您可以像这样使用正则表达式:

x <- '2x pet food brand 12kg'

gsub('^([0-9]+x)?[^0-9]*([0-9]+kg)', '\\1\\2', x)

## "2x12kg"
即使字符串的开头没有2x,这也会得到重量:

x <- 'pet food brand 12kg'

gsub('^([0-9]+x)?[^0-9]*([0-9]+kg)', '\\1\\2', x)

## "12kg"

可以使用这个正则表达式

m = gregexpr("([0-9]+x|[0-9.]+kg)", string, ignore.case = T)
result = regmatches(string, m)
r = paste0(unlist(result),collapse = "")
对于string=2x宠物食品品牌12kg,您将获得2x12kg

如果千克有小数,这也适用:


对于string=23x宠物食品23.5Kg,您会得到23x23.5Kg

将模式更改为:“^[0-9]+x”[^0-9]*[0-9]+kg”,因为它会删除除kg中最后一位以外的所有数字。您是对的!我不知道我怎么会错过。我编辑了我的答案。谢谢
x <- 'pet food brand 12kg'

gsub('^([0-9]+x)?[^0-9]*([0-9]+kg)', '\\1\\2', x)

## "12kg"
m = gregexpr("([0-9]+x|[0-9.]+kg)", string, ignore.case = T)
result = regmatches(string, m)
r = paste0(unlist(result),collapse = "")