我有一個成分資料集,每一行都是用逗號隔開的成分串列,例如:
燕麥(24%)(軋制,麩皮),椰子(13%)(椰子,防腐劑(220,223)),紅糖,牛奶固體,黃金糖漿(10%),種子(9%)(芝麻,葵花籽),人造奶油(植物油,水,鹽。乳化劑(471,大豆卵磷脂),抗氧化劑(307)),葡萄糖,牛奶巧克力混合物(5%)(糖,植物油,牛奶固體,可可粉,乳化劑(大豆卵磷脂,492),天然香料),天然香料
。我想對檔案進行決議,只將括號內的逗號替換為分號。可以有任何數量的括號,括號內可以有任何數量的逗號。結果應該是這樣的:
燕麥(24%)(軋制;麩皮),椰子(13%)(椰子;防腐劑(220;223)),紅糖,牛奶固體,黃金糖漿(10%),種子(9%)(芝麻;葵花籽),人造奶油(植物油;水;鹽。乳化劑(471;大豆卵磷脂);抗氧化劑(307)),葡萄糖,牛奶巧克力混合物(5%)(糖;植物油;牛奶固體;可可粉;乳化劑(大豆卵磷脂;492);天然香料),天然香料
。我可以得到一些幫助,在regex上可以解決這個問題嗎?謝謝你。
uj5u.com熱心網友回復:
1) gsubfn這可以不用復雜的正則運算式,使用gsubfn。 由一個點組成的正則運算式匹配一個單一的字符。 然后對于每個匹配的fun,通過x引數傳遞給它的那個字符被運行。 fun中的this$k指的是一個計數器,它從0開始,每次遇到(時增1,每次遇到)時減1。 如果計數器不為0,并且遇到了逗號,則回傳一個分號來代替逗號;否則,將回傳輸入字符。
library(gsubfn)
p < - proto(k = 0。 fun = function( this, x) {
if (x == "(")this$k< -k 1
if (x == ")")this$k < -k - 1
if (k & & x == ",") ";" else x
})
gsubfn("。", p, s)
給予:
[1] "燕麥(24%)(軋制。麩皮),椰子(13%)(椰子;防腐劑(220; 223),紅糖,牛奶固體,黃金糖漿(10%),種子(9%)(芝麻;向日葵),人造黃油(植物油;水;鹽;乳化劑(471;大豆卵磷脂);抗氧化劑(307)),葡萄糖,牛奶巧克力混合物(5%)(糖;植物油;牛奶固體;可可粉;乳化劑(大豆卵磷脂;492);天然香料),天然香料。
2) Base R一個基本的R解決方案是將輸入分成單個字符,給出字符向量chars,然后創建一個計數器向量k,與chars的長度相同,表示(到每個字符減去)的數量。 然后用分號替換那些對應于非零的k的逗號,并將chars轉換回一個單一的字串。
chars < - strsplit(s, "")[[1]]
k < - cumsum((chars == "(") - (chars == ")"))
chars[k & 字符== ","] <- " ;"
paste(chars, collapse = ")
注
輸入字串s如下。
s < - "燕麥(24%)(軋制,麩皮),椰子(13%)(椰子,防腐劑(220,223)),紅糖,牛奶固體,黃金糖漿(10%),種子(9%)(芝麻,葵花籽),人造奶油(植物油。水,鹽,乳化劑(471,大豆卵磷脂),抗氧化劑(307)),葡萄糖,牛奶巧克力混合物(5%)(糖,植物油,牛奶固體,可可粉,乳化劑(大豆卵磷脂,492),天然香料),天然香料。
uj5u.com熱心網友回復:
你可以使用?R像。
i <- gregexpr("([^( )]|(? R))*)", s, perl=TRUE)
regmatches(s, i)[[1]] < - gsub(",", " 。 ", regmatches(s, i)[[1]])
s
#[1] "燕麥(24%)(軋制;麩皮),椰子(13%)(椰子;防腐劑(220;223)),紅糖,牛奶固體,黃金糖漿(10%),種子(9%)(芝麻;葵花籽),人造奶油(植物油;水。鹽;乳化劑(471;大豆卵磷脂);抗氧化劑(307)),葡萄糖,牛奶巧克力混合物(5%)(糖;植物油;牛奶固體;可可粉;乳化劑(大豆卵磷脂;492);天然香料),天然香料"。
其中a(?R)z是一個遞回,匹配一個或多個字母a,后面是完全相同數量的字母z。
資料
s < - "燕麥(24%)(軋制,麩皮),椰子(13%)(椰子,防腐劑(220,223)),紅糖,牛奶固體,黃金糖漿(10%),種子(9%)(芝麻,葵花籽),人造奶油(植物油。水,鹽,乳化劑(471,大豆卵磷脂),抗氧化劑(307)),葡萄糖,牛奶巧克力混合物(5%)(糖,植物油,牛奶固體,可可粉,乳化劑(大豆卵磷脂,492),天然香料),天然香料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/307556.html
標籤:
