簡體   English   中英

用受控模式替換多個模式

[英]Replacing multiple patterns with manipulated pattern

我有一個想要轉換的文本字符串

text = "end back@drive@o correct back@drive@adjust@cats@do to tok"

"end back@drive drive@o correct back@drive drive@adjust adjust@cats cats@do to tok"

相反,我通常要替換

"a@b@c" with "a@b b@c"
"a@b@c@d" with "a@b b@c c@d"

等等。 我在下面的嘗試中使用了stringr包。

patterns = unlist(str_extract_all(text, "([[:alnum:]]+@){2,}[[:alnum:]]+"))
replacements = strsplit(patterns, "@")
replacements = lapply(replacements, function(y) {
  pretuples = y[-length(y)]  
  posttuples = y[-1]
  paste(paste0(pretuples, "@", posttuples), collapse = " ")
})  
replacements = do.call(c, replacements)
str_replace_all(text, pattern = patterns, replacement = replacements)

我不認為str_replace_all是我最后要尋找的函數,當然(合理地)返回

[1] "end back@drive drive@o correct back@drive@adjust to tok" 
[2] "end back@drive@o correct back@drive drive@adjust adjust@cats cats@do to tok"

誰能幫我解決這個問題?

非常感謝。

編輯:到目前為止,響應一直非常有用,但是我正在解析一個很大的文件,並不真正知道此a@b@c@d...模式將被鏈接多少次。 是否有一種更通用的解決方案,該解決方案在模式的長度上不依賴於硬編碼(如上所述)?

> gsub(x = text, pattern = '@(.*?)@', replacement = '@\\1 \\1@')
[1] "end back@drive drive@o correct back@drive drive@adjust to tok"

您需要提供更多有關預期會遇到的情況的示例,但是解決方案將與上述相同。

作為回應,您可能需要運行gsub(x = text, pattern = '@([[:alnum:]]{1,})@', replacement = '@\\\\1 \\\\1@')gsub(x = text, pattern = '@([[:alnum:]]{1,})@', replacement = '@\\\\1 \\\\1@') ,直到它保持不變。 同樣,如果沒有更多的測試用例,就無法確定。

我會用gsub

> text = "end back@drive@o correct back@drive@adjust to tok"
> gsub(pattern = "([[:alpha:]]+)@([[:alpha:]]+)@([[:alpha:]]+)", replacement = "\\1@\\2 \\2@\\3", x = text)
[1] "end back@drive drive@o correct back@drive drive@adjust to tok"

嘗試

pat <- "(\\s|\\b)[^@]+\\s(*SKIP)(*FAIL)|(?<=@)([^@]*)(?=@)"
repl <- "\\2 \\2"
gsub(pat, repl, text, perl=TRUE)
#[1] "end back@drive drive@o correct back@drive drive@adjust adjust@cats cats@do to tok"

對於“ str1”

gsub(pat, repl, str1, perl=TRUE)
#[1] "a@b b@c"                     "a@b b@c c@d"                
#[3] "a@b b@c c@d d@e e@f f@g g@h"

數據

text  <- "end back@drive@o correct back@drive@adjust@cats@do to tok"
str1 <- c("a@b@c", "a@b@c@d", "a@b@c@d@e@f@g@h")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM