Как получить строку с любой частично совпадающей строкой - PullRequest
5 голосов
/ 22 сентября 2019

У меня есть строка:

cc <- c("Bacter;httyh;ttyyyt", "Bacteria;hhhdh;hhgt;hhhg", "Bacter;hhhhdj;gg;dd", "Bactr;hhhg;ggj", "Bctg;hhgg;hhj")

Я хотел бы заменить любой текст, соответствующий Bact до первого ;, и заменить его на Bctr.

Я пытался: gsub("[Bact*]+;", "Bctr", cc)

Итак, я бы хотел получить результат:

Bctr;httyh;ttyyyt, Bctr;hhhdh;hhgt;hhhg, Bctr;hhhhdj;gg;dd, Bctr;hhhg;ggj, Bctg;hhgg;hhj

Есть какие-нибудь предположения о том, что мне здесь не хватает?

Ответы [ 3 ]

1 голос
/ 22 сентября 2019
ifelse(grepl("Bact", cc),
       paste0("Bctr", substring(cc,
                                attr(regexpr("Bact.*?;", cc), "match.length"),
                                nchar(cc))),
       cc)
#[1] "Bctr;httyh;ttyyyt"    "Bctr;hhhdh;hhgt;hhhg" "Bctr;hhhhdj;gg;dd"   
#[4] "Bctr;hhhg;ggj"        "Bctg;hhgg;hhj"  
1 голос
/ 22 сентября 2019

Мы можем использовать sub, сопоставляя Bact с последующими символами, которые не являются : ([^;]+), и заменяем на "Bctr"

sub("Bact[^;]+", "Bctr", cc)
#[1] "Bctr;httyh;ttyyyt" "Bctr;hhhdh;hhgt;hhhg" "Bctr;hhhhdj;gg;dd"  
#[4]  "Bctr;hhhg;ggj"        "Bctg;hhgg;hhj"      
1 голос
/ 22 сентября 2019

Мы можем использовать sub и заменить от "Bact" до первой точки с запятой на "Bctr";

sub("Bact.*?;", "Bctr;", cc)
#[1] "Bctr;httyh;ttyyyt" "Bctr;hhhdh;hhgt;hhhg" "Bctr;hhhhdj;gg;dd"  "Bctr;hhhg;ggj"

*?, используемое для ленивого соответствия, позволяющее сопоставить как можно меньше символоввозможно.Так что здесь он останавливается после сопоставления с первой точкой с запятой.

Разница будет ясна, если мы удалим из нее ?.

sub("Bact.*;", "Bctr;", cc)
#[1] "Bctr;ttyyyt" "Bctr;hhhg"   "Bctr;dd"     "Bctr;ggj"

Теперь оно соответствует последней точке с запятой в cc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...