字符串替换忽略字符

时间:2018-12-28 13:27:02

标签: r regex gsub stringr stringi

我有以下字符串:

string <- c("ABDSFGHIJLKOP")

和子字符串列表:

sub <- c("ABDSF", "SFGH", "GHIJLKOP")

我想在每个子匹配项之后包含<和>,从而得到:

<ABD><SF><GH><GHIJKOP>

我已经尝试通过对列表进行模式匹配来尝试以下代码,但是一旦匹配ABDSF,由于包含了<>字符,因此不再能够识别SFGH。有人有更好的主意吗?

library(stringr)
library(dplyr)
library(magrittr)

string <- c("ABDSFGHIJLKOP")
sub <- c("ABDSF", "SFGH", "GHIJLKOP")

for (s in sub){

string %<>% str_replace_all(., s, paste0('<', s,'>'))
}

print(string)


Result: [1] "<ABDSF><GHIJLKOP>"

编辑:上面的代码存在的问题是,一旦插入<>字符,则在第一个字符串匹配后,第二个字符串SFGH将不再被识别,因为该字符串现在是:

 <ABDSF>GHIJLKOP. 

所以我正在寻找一种匹配子字符串而忽略<>字符的方法。

2 个答案:

答案 0 :(得分:3)

[<>]*放在sub的连续字符之间,然后使用这些模式进行替换。不使用任何软件包。

# test input
string <- "ABDSFGHIJLKOP"
subs <- c("ABDSF", "SFGH", "GHIJLKOP")

pats <- paste0("(", gsub("(?<=[EF])(.)(?=.)", "\\1[<>]*", subs, perl = TRUE), ")")
s <- string
for(p in pats) s <- gsub(p, "<\\1>", s)
s
## [1] "<ABD<SF><GH>IJLKOP>"

更新

关于以下评论,如果我理解正确,我们可以添加(?<=[EF])给予:

pats <- paste0("(", gsub("(?<=[EF])(.)(?=.)", "\\1[<>]*", subs, perl = TRUE), ")")
s <- string
for(p in pats) s <- gsub(p, "<\\1>", s)
s
## [1] "<ABDSF><GHIJLKOP>"

答案 1 :(得分:0)

#R version 3.3.2 

library(stringr)
library(magrittr)

string <- c("ABDSFGHIJLKOP")
sub <- c("ABDSF", "SFGH", "GHIJLKOP")
result <- c("")
for (s in sub){
temp<- c(str_extract(string, s))
if (!is.null(temp)) {
        temp<- paste("<",temp,">",sep = "")
        result <- paste(result,temp,sep = "")

    }
}
print(result)

结果:

[1] "<ABDSF><SFGH><GHIJLKOP>"

经过Rextester

的测试