You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中移除特定词汇后的文本,保留首姓名与括号内容

R语言文本处理:保留首个姓名及括号内容的解决方案

刚接触正则确实容易踩坑,你之前用str_remove("and.*")会把括号也删掉,是因为.*是贪婪匹配,会把and后面所有内容(包括最后的括号)都删掉,这就不符合需求啦。

针对你的场景,我们可以用stringr包的str_replace函数,精准匹配并替换掉中间不需要的内容,同时保留第一个姓名和最后的括号部分。

具体实现代码

首先定义你的输入文本向量:

input_text <- c(
  "Anders Ahlgren och Anders Åkesson (C)",
  "Karin Nilsson (C)",
  "Edward Riedl (M)",
  "Per-Ingvar Johnsson och Anders Åkesson (C)",
  "Per-Ingvar Johnsson och Annika Qarlsson (C)",
  "Annika Qarlsson och Ulrika Carlsson i Skövde (C)"
)

然后执行替换操作:

library(stringr)

output_text <- str_replace(input_text, "\\s+(och|and).*?(\\([A-Za-z]{1,2}\\))", " \\2")

运行后得到的output_text就是你想要的结果:

[1] "Anders Ahlgren (C)"           "Karin Nilsson (C)"           
[3] "Edward Riedl (M)"             "Per-Ingvar Johnsson (C)"     
[5] "Per-Ingvar Johnsson (C)"      "Annika Qarlsson (C)"

正则表达式解释

咱们拆解一下这个正则\\s+(och|and).*?(\\([A-Za-z]{1,2}\\)):

  • \\s+:匹配一个或多个空格,确保我们定位到och/and前面的分隔空格
  • (och|and):同时匹配瑞典语的och和英语的and,覆盖你所有的输入情况
  • .*?:非贪婪匹配任意字符,这样只会匹配到后面的括号前就停止,不会把括号包含进去
  • (\\([A-Za-z]{1,2}\\)):捕获最后的括号部分,其中\\(和\\)是转义后的括号,[A-Za-z]{1,2}匹配括号内1-2个大小写字母
  • 替换为 \\2:用空格加上捕获到的括号部分(也就是第二个分组的内容),这样就把中间多余的内容替换掉,保留第一个姓名和括号。

这个方法还能兼容没有och/and的情况(比如你的第2、3条输入),因为正则不会匹配到任何内容,原文本会被完整保留,完美符合你的需求~

内容的提问来源于stack exchange,提问作者Tomas R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 14:27:40