確實有人知道如何在表達式中找到字符串的第n次出現以及如何用正則表達式替換它?正則表達式:替換第n次出現
,比如我有以下字符串
txt <- "aaa-aaa-aaa-aaa-aaa-aaa-aaa-aaa-aaa-aaa"
,我想更換的第5 occurence「 - 」由「|」 和第七次出現' - 'by「||」像
[1] aaa-aaa-aaa-aaa-aaa|aaa-aaa||aaa-aaa-aaa
我該怎麼做?
感謝, 弗洛裏安
做到這一點確實有人知道如何在表達式中找到字符串的第n次出現以及如何用正則表達式替換它?正則表達式:替換第n次出現
,比如我有以下字符串
txt <- "aaa-aaa-aaa-aaa-aaa-aaa-aaa-aaa-aaa-aaa"
,我想更換的第5 occurence「 - 」由「|」 和第七次出現' - 'by「||」像
[1] aaa-aaa-aaa-aaa-aaa|aaa-aaa||aaa-aaa-aaa
我該怎麼做?
感謝, 弗洛裏安
做到這一點(1)子它可以在一個單一的正則表達式來完成與sub
:
> sub("(^(.*?-){4}.*?)-(.*?-.*?)-", "\\1|\\3||", txt, perl = TRUE)
[1] "aaa-aaa-aaa-aaa-aaa|aaa-aaa||aaa-aaa-aaa"
(2)子兩次或該變型中,其調用sub
兩次:
> txt2 <- sub("(^(.*?-){6}.*?)-", "\\1|", txt, perl = TRUE)
> sub("(^(.*?-){4}.*?)-", "\\1||", txt2, perl = TRUE)
[1] "aaa-aaa-aaa-aaa-aaa|aaa-aaa||aaa-aaa-aaa"
(3)sub.fu n或這種變化形成一個功能sub.fun
,它可以替代一個。它利用來自gsubfn package的fn$
將n-1
,pat
和value
代入sub
參數。首先定義指定的功能,然後調用它兩次。
library(gsubfn)
sub.fun <- function(x, pat, n, value) {
fn$sub("(^(.*?-){`n-1`}.*?)$pat", "\\1$value", x, perl = TRUE)
}
> sub.fun(sub.fun(txt, "-", 7, "||"), "-", 5, "|")
[1] "aaa-aaa-aaa-aaa-aaa|aaa-aaa||aaa-aaa-aaa"
(我們也可以使用paste
或sprintf
的sub.fun
主體以得到基礎R解決方案,但在一些附加的詳細程度爲代價改性的參數sub
。)
這可以被改寫爲一個替換功能給這個令人愉悅的序列:
"sub.fun<-" <- sub.fun
tt <- txt # make a copy so that we preserve the input txt
sub.fun(tt, "-", 7) <- "||"
sub.fun(tt, "-", 5) <- "|"
> tt
[1] "aaa-aaa-aaa-aaa-aaa|aaa-aaa||aaa-aaa-aaa"
(4)gsubfn從T使用gsubfn
他gsubfn package我們可以使用一個特別簡單的正則表達式(它只是"-"
)和代碼有一個非常簡單的結構。我們通過原型方法進行替代。包含該方法的proto對象代替替換字符串。這種方法的簡單性導出FRON事實gsubfn
自動使count
變量提供給這樣的方法:
library(gsubfn) # gsubfn also pulls in proto
p <- proto(fun = function(this, x) {
if (count == 5) return("|")
if (count == 7) return("||")
x
})
> gsubfn("-", p, txt)
[1] "aaa-aaa-aaa-aaa-aaa|aaa-aaa||aaa-aaa-aaa"
UPDATE:一些修正。
更新2:爲(3)添加了替換函數方法。
更新3:增加pat
參數到sub.fun
。
的一種方法是使用gregexpr
找到-
的位置:
posns <- gregexpr("-",txt)[[1]]
,然後粘貼到相關部分和隔板一起:
paste0(substr(txt,1,posns[5]-1),"|",substr(txt,posns[5]+1,posns[7]-1),"||",substr(txt,posns[7]+1,nchar(txt)))
[1] "aaa-aaa-aaa-aaa-aaa|aaa-aaa||aaa-aaa-aaa"
另一種可能性是使用Hadley的stringr
包構建基礎爲函數I寫道:
require(stringr)
replace.nth <- function(string, pattern, replacement, n) {
locations <- str_locate_all(string, pattern)
str_sub(string, locations[[1]][n, 1], locations[[1]][n, 2]) <- replacement
string
}
txt <- "aaa-aaa-aaa-aaa-aaa-aaa-aaa-aaa-aaa-aaa"
txt.new <- replace.nth(txt, "-", "|", 5)
txt.new <- replace.nth(txt.new, "-", "||", 7)
txt.new
# [1] "aaa-aaa-aaa-aaa-aaa|aaa-aaa-aaa||aaa-aaa"
謝謝!這就是我要找的 – user1087590
@Henrik,我認爲你的解決方案存在一個小錯誤。從您的輸出中可以看到,原始系列中的第8個「 - 」被更改,而不是第7個。您必須更改2行,以便從將第7個「 - 」更改爲「||」的行開始,否則其中一個「 - 」已更改。 :-) – hvollmeier
很好,相當多的可能性!謝謝,弗洛裏安 – user1087590