如何移除纯字母组成字符串中的第三个单词(保留含数字或双单词的字符串不变)
如何移除纯字母组成字符串中的第三个单词(保留含数字或双单词的字符串不变)
嗨,我明白你遇到的问题了!你之前用的gsub("\\s*\\w*$", "", df$Species)会一刀切删掉每个字符串的最后一个单词,这当然不符合你的需求——你只想处理全由字母组成且有三个及以上单词的物种名,去掉第三个单词;而带数字/特殊符号、或者只有两个单词的名称得原封不动保留。
我给你调整一下正则表达式,用Perl风格的正则来精准匹配需要处理的字符串:
df$Species <- gsub("^(([A-Za-z]+\\s){2})[A-Za-z]+\\s?", "\\1", df$Species, perl = TRUE)
我来给你拆解一下这个正则的逻辑,帮你理解为什么它能满足需求:
^:锚定字符串的开头,避免匹配中间的片段(([A-Za-z]+\\s){2}):这是一个捕获组,专门匹配前两个纯字母单词(每个单词后跟一个空格),后面替换的时候会保留这部分内容[A-Za-z]+\\s?:匹配第三个纯字母单词,后面的\\s?是为了兼容第三个单词是字符串最后一个的情况(比如Aaadonta constricta babelthuapi这种)\\1:把匹配到的内容替换成之前捕获的前两个单词,相当于直接删掉第三个纯字母单词perl = TRUE:开启Perl风格正则支持,让上面的锚定和捕获组逻辑正常工作
你可以测试一下这个代码:
- 像
Aaadonta constricta babelthuapi这类三个纯字母单词的字符串,会变成Aaadonta constricta - 带数字/符号的
Aaadonta constricta ssp. 2 DAB-2020、双单词的Aaaaba fossicollis都不会被匹配到,完全保留原样,和你想要的输出一致。
备注:内容来源于stack exchange,提问作者tadeufontes
相关产品推荐
相关产品推荐

