2017-02-26 62 views
1

之間搜索並替換多個字符串中出現的模式嘗試在封閉模式後搜索並替換多個出現的模式,如"AxB""AxxB"中的長字符串(其中"x"可以是任何字符)在前綴爲"["的字符串中,以及"]"(例如"[AxB]""[AxxB]"),如以下示例中所示。搜索並在[]和

任何單詞字符以及任何數目的單詞字符可以之間的和發生。我只能找到模式,但不知道如何通過使用gsub()函數和可能的paste()函數爲模式添加前綴和後綴來替換它。有沒有辦法做到這一點?

轉換以下字符串:

"CCBCACBAHGABGGARBJDFDFADFDFBFDFD""CCBC[ACB]AHG[AB]GG[ARB]JDFDF[ADFDFB]FDFD"

回答

3

使用gsub以匹配A之後,直到我們到達B哪些不是A其他字符數最少更換了比賽。下面,x是輸入字符串(如問題中,並在最後的註釋中重複),但它可能是這樣的字符串的字符向量,例如c(x, x),它應該仍然工作。沒有使用包裹。

gsub("(A[^A]*?B)", "[\\1]", x) 
## [1] "CCBC[ACB]AHG[AB]GG[ARB]JDFDF[ADFDFB]FDFD" 

注:

x <- "CCBCACBAHGABGGARBJDFDFADFDFBFDFD" 
2
txt <- "CCBCACBAHGABGGARBJDFDFADFDFBFDFD" 
expected <- "CCBC[ACB]AHG[AB]GG[ARB]JDFDF[ADFDFB]FDFD" 

# Find matches. 
matches <- regmatches(txt, gregexpr("(?=A).*?(?<=B)", txt, perl=TRUE))[[1]] 
matches <- matches[matches != ""] 

# Iterate through and make replacements. 
for(match in matches){ 
    txt <- gsub(match, paste0("\\[", match, "\\]"), txt) 
} 

txt == expected # TRUE 

我敢肯定有一個更好的方式做gsub部分。

0

使用stringr包(類似的可以做什麼用gsub

library(stringr) 
string <- "CCBCACBAHGABGGARBJDFDFADFDFBFDFD" 
str_replace_all(string, pattern = "(A.*?B)", "[\\1]") 
+1

這產生'CCBC [ACB] [AHGAB] GG [ARB] JDFDF [ADFDFB] FDFD'這是不期望的輸出。 –