繁体   English   中英

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

[英]R - extracting multiple patterns from string using gregexpr

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

x = '2x pet food brand 12kg'

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

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

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

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

我将不胜感激。

编辑----

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

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)

尽管这仍然可以提取公斤,但只会删除带有g的实例,并保留字符串的其余部分,例如:

x = 'Pet food brand    '

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

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

后一个选项根本不提取产品的重量,只是使字符串完整无缺。

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

您可以使用此正则表达式

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"

(编辑以纠正@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"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM