如何用R提取不同模式前后及中间的字符串并存储?
从DataFrame列中提取多模式关键词的解决方案
核心思路
直接通过正则匹配所有符合关键词特征的内容:关键词是不包含 /、[、]、- 和空格的连续字符序列,这种方式能覆盖你给出的所有字符串模式。
单个字符串测试
先针对你的示例字符串验证效果:
library(stringr) # 示例1 a <- "keyword1 / keyword2 [keyword3 - keyword4 - keyword5 - keyword6][keyword7]" # 提取所有关键词 str_extract_all(a, "[^/\\[\\]-\\s]+")[[1]] # 输出结果: # [1] "keyword1" "keyword2" "keyword3" "keyword4" "keyword5" "keyword6" "keyword7" # 示例2 b <- "keyword1[keyword3]" str_extract_all(b, "[^/\\[\\]-\\s]+")[[1]] # 输出结果: # [1] "keyword1" "keyword3"
应用到DataFrame
假设你的DataFrame结构如下:
df <- data.frame( text = c( "keyword1 / keyword2 [keyword3 - keyword4 - keyword5 - keyword6][keyword7]", "keyword1[keyword3]" ) )
方式1:将提取结果存储为列表列
保留每行对应的关键词列表:
library(dplyr) df <- df %>% mutate(keywords = str_extract_all(text, "[^/\\[\\]-\\s]+")) # 查看列表列结果 df$keywords # [[1]] # [1] "keyword1" "keyword2" "keyword3" "keyword4" "keyword5" "keyword6" "keyword7" # # [[2]] # [1] "keyword1" "keyword3"
方式2:展开为多行DataFrame
如果需要将每个关键词单独占一行:
library(dplyr) library(tidyr) df_expanded <- df %>% mutate(keywords = str_extract_all(text, "[^/\\[\\]-\\s]+")) %>% unnest(keywords) # 查看展开后的结果 print(df_expanded) # text keywords # 1 keyword1 / keyword2 [keyword3 - keyword4 - keyword5 - keyword6][keyword7] keyword1 # 2 keyword1 / keyword2 [keyword3 - keyword4 - keyword5 - keyword6][keyword7] keyword2 # 3 keyword1 / keyword2 [keyword3 - keyword4 - keyword5 - keyword6][keyword7] keyword3 # 4 keyword1 / keyword2 [keyword3 - keyword4 - keyword5 - keyword6][keyword7] keyword4 # 5 keyword1 / keyword2 [keyword3 - keyword4 - keyword5 - keyword6][keyword7] keyword5 # 6 keyword1 / keyword2 [keyword3 - keyword4 - keyword5 - keyword6][keyword7] keyword6 # 7 keyword1 / keyword2 [keyword3 - keyword4 - keyword5 - keyword6][keyword7] keyword7 # 8 keyword1[keyword3] keyword1 # 9 keyword1[keyword3] keyword3
补充说明
如果你的关键词包含.、_这类特殊字符,上述正则依然适用;如果关键词有其他自定义规则,只需调整正则表达式中的排除字符即可。
内容的提问来源于stack exchange,提问作者Linda
相关产品推荐
相关产品推荐

