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

时间:2017-07-31 16:08:57

标签: r regex

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

x = '2x pet food brand 12kg'

我想做的是将它缩短到2x12kg。 我不擅长在R中使用regexp,并希望有人在这里帮助我。

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

m <- gregexpr("(^[0-9]+x [0-9]+kg)", x)

不幸的是,这只给了我'10公斤'不包括'2x'

我很感激任何帮助。

编辑----

在解决了我的初始问题之后,我发现在不同格式的数据中有一些实例,我也想提取:

x = 'Pet food brand 15x85g'
# Should be:
x = '15x85g'

我试图在gsub中使用OR语句,例如:

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)

虽然这仍然会提取公斤,但它只会删除带有克的实例并留下其余的字符串,例如:

x = 'Pet food brand    '

或者使用以下命令再次运行gsub:

m <- gsub('([0-9]+x[0-9]+g)', '\\1', x)

后一个选项根本不提取产品重量,只保留完整的字符串。

很抱歉没有注意到字符串之前的格式不同。再次,任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式

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

对于string = "2x pet food brand 12kg",您获得"2x12kg"

如果千克有小数,这也有效:

对于string = "23x pet food 23.5Kg",您获得"23x23.5Kg"

答案 1 :(得分:0)

(编辑纠正@R.Schifini指出的错误)

你可以使用这样的正则表达式:

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

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

## "2x12kg"

即使没有&#34; 2x&#34;这也可以减轻你的体重。在字符串的开头:

x <- 'pet food brand 12kg'

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

## "12kg"