Строка заменяет игнорирование символов - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть следующая строка:

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 голосов
/ 28 декабря 2018

Поместите [<>]* между последовательными символами в 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>"
0 голосов
/ 28 декабря 2018
#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

...