在R中使用正则表达式提取并拆分姓名数据的技术求助
解决方案
针对你的姓名数据处理需求,我们可以分两步完成:先清理原始字符串得到规范全名,再拆分成名和姓。以下是具体的R代码实现(基于tidyverse工具包):
步骤1:清理姓名生成规范全名
首先加载依赖包,然后对原始姓名进行多维度清理:
library(tidyverse) # 修正原始数据的语法错误后定义数据集 names_data <- structure(list(name = c('Eric Smith ♕', 'Dave Holmes - Realtor', 'Erin Speck ≈¶', 'Michael Jackson | Denver', 'Scott Joseph Taylor', 'Jeff D. Hill', '|Ryan Armory|', 'Lisa Turrow💦', 'Rory Wilcox Makeup Artist', 'annie longer // modelingagency', 'Leah Young | HOUSTON, TX', 'Harley Barvis Jarvis', 'Neil Anderson Photography', 'Erica Sparkles Jr.', 'Jessica Ann Peterson Jr.')), class = "data.frame", row.names = c(NA, -15L)) # 清理姓名 names_cleaned <- names_data %>% mutate( # 移除所有非字母、非空格的字符(含特殊符号、emoji、管道符等) name = str_remove_all(name, "[^A-Za-z\\s]"), # 移除末尾的"Jr."或"Jr"后缀 name = str_remove(name, "\\sJr\\.?$"), # 保留第一个和最后一个单词,移除中间所有内容(处理中间名、职业/地点后缀) name = str_replace(name, "^(\\w+)(\\s.+\\s)(\\w+)$", "\\1 \\3"), # 将每个单词首字母大写 name = str_to_title(name), # 移除多余的连续空格 name = str_squish(name) )
执行后names_cleaned的name列会和你预期的names_regex完全一致。
步骤2:拆分名和姓
将清理后的全名拆分为名(first)和姓(last):
names_final <- names_cleaned %>% separate(name, into = c("first", "last"), sep = "\\s", extra = "drop", fill = "right")
最终的names_final数据框会和你要求的结果完全匹配。
代码说明
str_remove_all:彻底清除干扰字符,只保留姓名的核心字母部分str_remove:针对性移除常见的后缀"Jr."str_replace:精准保留首尾单词,过滤中间的中间名、职业描述、地点信息str_to_title:统一姓名的大小写格式separate:按空格拆分全名,自动适配双单词结构
内容的提问来源于stack exchange,提问作者wizkids121
相关产品推荐
相关产品推荐

