R语言中从数据框列的JSON格式字符串提取指定词汇的方法
解决方法
首先,你之前的正则匹配不到是因为目标字符串里的名称(比如Bank)后面跟着的是',而不是'},所以你的正则\\w+(?='\\})找不到对应的匹配项。下面给你两种可靠的解决方式:
方法一:解析为JSON(推荐)
因为你的字符串本质是类似JSON的结构,用专门的JSON解析工具比正则更稳妥,不容易出错。步骤如下:
- 先把字符串里的单引号替换成双引号,转换成合法的JSON格式
- 使用
jsonlite包解析,直接提取name字段
library(jsonlite) # 假设A是你数据框列中的单个字符串元素 A <- "[{'name': 'Bank', 'id': 559}, {'name': 'Cinema', 'id': 2550}, {'name': 'Shopping', 'id': 10201}]" # 替换单引号为双引号 valid_json <- gsub("'", '"', A) # 解析JSON并提取name列 result <- fromJSON(valid_json)$name print(result) # 输出:[1] "Bank" "Cinema" "Shopping"
如果是数据框的整列操作,可以用dplyr配合处理:
library(dplyr) library(jsonlite) library(purrr) your_df <- your_df %>% mutate(names_list = map_chr(your_target_column, function(x) { valid_json <- gsub("'", '"', x) paste(fromJSON(valid_json)$name, collapse = ", ") }))
方法二:使用正则表达式
如果你一定要用正则来提取,可以调整正则表达式,匹配'name': '和下一个'之间的内容:
library(stringr) A <- "[{'name': 'Bank', 'id': 559}, {'name': 'Cinema', 'id': 2550}, {'name': 'Shopping', 'id': 10201}]" result <- str_extract_all(A, "(?<='name': ')[^']+(?=')")[[1]] print(result) # 输出:[1] "Bank" "Cinema" "Shopping"
正则解释:
(?<='name': '):正向回顾断言,确保匹配内容的前面是'name': '[^']+:匹配任意数量的非单引号字符(也就是我们要提取的名称)(?='):正向预查断言,确保匹配内容的后面是单引号
内容的提问来源于stack exchange,提问作者user36729
相关产品推荐
相关产品推荐

