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

qoefvg9y  于 2023-04-22  发布在  其他
关注(0)|答案(2)|浏览(118)

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

x = '2x pet food brand 12kg'

我想做的是把它缩短到2x 12 kg。我不太擅长在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)

后一个选项根本不提取产品重量,而只是保持字符串不变。
很抱歉没有注意到字符串的格式不同。再次,任何帮助都将不胜感激。

58wvjzkj

58wvjzkj1#

您可以使用此正则表达式

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"

sbtkgmzw

sbtkgmzw2#

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

相关问题