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

在R语言中使用正则表达式或子串提取列中的特定词汇

嘿,针对你在R语言中从数据列提取特定词汇的需求,我整理了几个实用的方法,结合你给出的样本数据来演示:

首先先构造你的样本数据框方便测试:

df <- data.frame(
  Opex_Spend_Month = c(92179.84, 297.82, 13974.8, 138.6, NA, NA, 1388.65),
  Opex_Spend_YTD = c(113542.84, 82392.82, 34917.8, 63125.6, 73097, 96035, 68934.65),
  Major_Category = rep("Contingent Labour", 7),
  NBS_Region = rep("EUROPE", 7),
  Sub_Category = c("TEMP:OTH.CONT.WORKER", "TEMP:OTH.CONT.WORKER", "TEMP:OTH.CONT.WORKER", 
                   "TEMP:OTH.CONT.WORKER", "TEMP:MSP NON IT", "TEMP:MSP NON IT", "TEMP:MSP NON IT")
)
方法1:Base R 正则表达式(最通用)

如果你的Sub_Category列都是以TEMP:开头,想要提取冒号后面的全部内容,用sub()函数最方便,它可以直接替换掉开头的TEMP:部分:

# 提取冒号后的所有内容
df$Extracted_Term <- sub("^TEMP:", "", df$Sub_Category)

解释:^TEMP:是正则表达式,^表示匹配字符串开头,把匹配到的部分替换为空字符串,就得到了我们需要的内容。

运行后查看结果:

print(df$Extracted_Term)

输出:

[1] "OTH.CONT.WORKER" "OTH.CONT.WORKER" "OTH.CONT.WORKER" "OTH.CONT.WORKER"
[5] "MSP NON IT"      "MSP NON IT"      "MSP NON IT"
方法2:Base R 子串截取(适合固定格式)

如果TEMP:的长度固定(永远是5个字符:T-E-M-P-:),可以直接用substr()截取从第6位开始到末尾的内容:

df$Extracted_Term <- substr(df$Sub_Category, start = 6, stop = nchar(df$Sub_Category))

这个方法比正则更快,但缺点是如果Sub_Category的前缀有变化(比如不是TEMP:)就失效了,所以只适合格式完全固定的场景。

方法3:Tidyverse stringr 包(更直观的语法)

如果你习惯用tidyverse的管道语法,可以用stringr包的str_extract()函数,配合正则正向断言来提取内容:

library(stringr)
library(dplyr)

df <- df %>% 
  mutate(Extracted_Term = str_extract(Sub_Category, "(?<=TEMP:).*"))

解释:(?<=TEMP:)是正则正向断言,表示匹配TEMP:后面的所有内容(.*代表任意字符任意长度),语法上更清晰,适合复杂的字符串提取需求。

进阶:提取更细分的词汇

如果你的需求不是提取全部内容,而是比如提取OTH、MSP这类前缀,可以调整正则表达式:

# 提取冒号后第一个分隔符(点或空格)前的内容
df$Short_Term <- sub("^TEMP:([A-Z]+)[. ].*", "\\1", df$Sub_Category)

运行后df$Short_Term会得到:["OTH", "OTH", "OTH", "OTH", "MSP", "MSP", "MSP"]


内容的提问来源于stack exchange,提问作者Shuvayan Das

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:26:31