R语言如何修剪数据框内字符串首尾内容并保留中间部分
解答
完全可以用单条字符串处理命令实现需求,不需要拆分两次替换,最贴合你“保留中间内容、移除前后固定字符”思路的方案是用正则捕获组,鲁棒性比多次替换更好。
- 针对white_player列的单字段写法
匹配整段字符串的固定结构:开头为[White、结尾为],把中间需要保留的用户名用圆括号标记为捕获组,替换时仅保留捕获组内容即可:
library(stringr) # 单个值测试 str_replace(game_summary_df[1,1], "^\\[White (.*)\\]$", "\\1") # 输出结果为 "Gyc12" # 整列清洗直接传入列向量即可 game_summary_df$white_player <- str_replace( game_summary_df$white_player, "^\\[White (.*)\\]$", "\\1" )
正则规则说明:
^锚定字符串开头、$锚定字符串结尾,避免误匹配内容中的无关字符\\[White匹配开头需要删除的固定前缀(.*)捕获中间任意长度的内容(即需要保留的用户名),标记为第1个捕获组\\]匹配结尾需要删除的右方括号替换参数
\\1代表引用第1个捕获组匹配到的内容,实现“只留中间值”的效果全表通用批量清洗写法
你的数据集所有列都遵循[字段标签 字段值]的统一格式,可以写一套通用规则一次性清洗所有列,不需要给每列单独写前缀匹配规则:
game_summary_df <- as.data.frame( lapply(game_summary_df, function(col) { str_replace(col, "^\\[\\w+\\s(.*)\\]$", "\\1") }) )
清洗后直接得到纯值的规整数据:
| white_player | black_player | result | white_elo | black_elo |
|---|---|---|---|---|
| Gyc12 | SuperCarp | 1/2-1/2 | 1355 | 1243 |
补充:如果只是简单删除固定片段,也可以用str_remove_all搭配正则或运算符|,一次性匹配所有要删除的内容:
str_remove_all(game_summary_df[1,1], "\\[White |\\]")
但这种写法不会锚定字符位置,如果字段值本身包含]字符会出现误删,处理结构化格式的数据更推荐用捕获组方案。
内容的提问来源于stack exchange,提问作者supercarp
相关产品推荐
相关产品推荐

