如何在字符串中替换一个内部大写字母

4

我有一系列字符串,如下:

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"。当我尝试使用 gsub 替换大写字母 "N" 时,它会替换所有出现的 N,而不仅仅是内部的 "N"。


寻找非单词边界的想法 -> 用“-”替换\BN\B (gsub使用perl=TRUE) - bobble bubble
3个回答

2

我们可以查找被 \w 包围的任何 N,这在正则表达式中匹配任何字母数字字符或下划线。如果这太宽泛了,你可以用 [a-zA-Z] 替换 \w 只匹配字母:

stringr::str_replace_all(vec, "(\\w)N(\\w)", "\\1-\\2")

1
我们可以使用“向后查找”来将单词中间的"N"替换为"-"
gsub("(?<!^)\\wN", "-", vec, perl = TRUE)

#[1] "Peronospora bon-henrici"  "Cystoseira abie-marina"  "Niplommatina rubra"
#[4] "Padina sancta-crucis" "Nachygrapsus Nauru-liguricus" "Melphidippa borealis"

1
我们可以使用带有捕获组的 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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接