簡體   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