Как заменить внутреннюю заглавную букву в строке - PullRequest
4 голосов
/ 26 сентября 2019

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

vec<-c("Peronospora boniNhenrici","Cystoseira abiesNmarina","Niplommatina rubra",
 "Padina sanctaeNcrucis","Nachygrapsus NaurusNliguricus","Melphidippa borealis")

Я хотел бы заменить внутреннюю заглавную букву "N" во втором слове для каждого элемента на "-", так что он хотел бы:

("Peronospora boni-henrici","Cystoseira abies-marina","Niplommatina rubra",
 "Padina sanctae-crucis,"Nachygrapsus Naurus-liguricus","Melphidippa borealis")

Есть предложения?У меня есть местоположения, использующие следующее:

stri_locate_all(vec,regex = "[N]")

, но я не уверен, как заменить «N», если оно внутреннее.Когда я пытаюсь заменить заглавную букву «N» с помощью gsub, он заменяет все вхождения N, а не только внутренний «N».

Ответы [ 4 ]

2 голосов
/ 26 сентября 2019

Мы можем искать любые N, окруженные \w, что в регулярном выражении соответствует любым буквенно-цифровым символам или подчеркиванию.Если это слишком широк, вы можете заменить \w на [a-zA-Z], чтобы соответствовать только буквам:

stringr::str_replace_all(vec, "(\\w)N(\\w)", "\\1-\\2")
1 голос
/ 26 сентября 2019

Мы можем использовать gsub с группами захвата

gsub("([a-z])N([a-z])", "\\1-\\2", vec)
#[1] "Peronospora boni-henrici"  "Cystoseira abies-marina" "Niplommatina rubra"         
#[4] "Padina sanctae-crucis"       
#[5] "Nachygrapsus Naurus-liguricus" "Melphidippa borealis"
1 голос
/ 26 сентября 2019

Мы можем использовать оглядку назад, чтобы заменить "N" в середине слова на "-"

gsub("(?<!^)\\wN", "-", vec, perl = TRUE)

#[1] "Peronospora bon-henrici"  "Cystoseira abie-marina"  "Niplommatina rubra"
#[4] "Padina sancta-crucis" "Nachygrapsus Nauru-liguricus" "Melphidippa borealis"
0 голосов
/ 26 сентября 2019

Если ваш регулярный выражения поддерживает \B не границы слов (используйте gsub с perl=TRUE)

\BN\B

И заменить на -.Смотрите это демо на Regex101 .

...