![](/img/trans.png)
[英]R programming - How do I remove a string that appears multiple times in a text using 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.