限制R中特定单词后的字符长度

时间:2014-10-30 10:04:51

标签: regex r

我有想要清理的名字矢量。我想缩短每个字符的长度:

示例:

x <- c("LambMa, a.b.c., LaMa (shorter wording), LambM, abc , a.b.c",
       "LambMa, a.b.c., LaMa (shorter wording)") 

我想在这个例子中只获得第一个LambMa a.b.c.并切断其余部分。因此,如果特定字符不包含a.b.c.两次DO NOTHING(跳过)。

因此要查找的特定单词或表达式为"a.b.c"。所以在第一次出现后切掉剩下的。

编辑:我想从向量a.b.c.中获取x(包含)之前的字符,以防在给定字符串{{1}中出现a.b.c.的两倍}}

上述示例的解决方案是:

x

编辑2:部分解决方案也非常有用并且会被接受。感谢

2 个答案:

答案 0 :(得分:2)

x <- c("LambMa, a.b.c., LaMa (shorter wording), LambM, abc , a.b.c",
       "LambMa, a.b.c., LaMa (shorter wording)") 

occ_abc<-gregexpr("a.b.c",x) # find the occurences of "a.b.c."
for(i in 1:length(occ_abc)){ # for each item of x
    if(length(occ_abc[[i]])>=2) { # if there is 2 or more occurences
      x[i]<-substr(x[i],1,occ_abc[[i]][1]+5) # replace with first part of the string
    } else { # else leave the item untouched
      x[i]
    }
}

>x

[1] "LambMa, a.b.c."                         "LambMa, a.b.c., LaMa (shorter wording)"

if...else部分很可能被ifelse声明替换。

答案 1 :(得分:2)

如果指定的模式匹配,您可以使用gsub换出。为避免使用后视,您可以捕获第一个a.b.c.并替换为它:

gsub("(a\\.b\\.c\\.).+(a\\.b\\.c)","\\1",x)
[1] "LambMa, a.b.c."                        
[2] "LambMa, a.b.c., LaMa (shorter wording)"