使用stringr包格式化作者姓名的技术实现需求
使用stringr格式化作者姓名字符串
需求说明
需要将作者姓名转换为 LAST, 1st. 2nd. 3rd. ... 格式,具体规则及示例如下:
- 单姓名示例:
Daenerys Targaryen→TARGARYEN, D.George R. R. Martin→MARTIN, G. G. R.Luís Inácio Lula da Silva→SILVA, L. I. L. da
- 多姓名示例:
Daenerys Targaryen, Luís Inácio Lula da Silva→TARGARYEN, D.; SILVA, L. I. L. da
实现方案
使用stringr包结合正则表达式编写自定义函数,分别处理单姓名和多姓名场景:
- 加载依赖包
library(stringr) library(purrr) # 用于批量处理多姓名
- 编写单姓名格式化函数
format_single_name <- function(name) { # 提取姓氏(最后一个首字母大写的单词,支持带重音字符) last_name <- str_extract(name, "\\b[A-ZÀ-ÿ][a-zÀ-ÿ]+$") # 提取姓氏以外的部分(名+可能的小写前缀) rest_part <- str_trim(str_remove(name, str_c("\\b", last_name, "$"))) # 提取名的首字母(所有首字母大写的单词的首字母) initials <- str_extract_all(rest_part, "\\b[A-ZÀ-ÿ]")[[1]] initials_formatted <- str_c(initials, ".", collapse = " ") # 提取小写前缀(如果存在,即rest_part末尾的小写单词) prefix <- str_extract(rest_part, "\\b[a-zà-ÿ]+$") if (!is.na(prefix)) { initials_formatted <- str_c(initials_formatted, " ", prefix) } # 组合最终格式 str_c(str_to_upper(last_name), ", ", initials_formatted) }
- 测试单姓名格式化
format_single_name("Daenerys Targaryen") # [1] "TARGARYEN, D." format_single_name("George R. R. Martin") # [1] "MARTIN, G. R. R." format_single_name("Luís Inácio Lula da Silva") # [1] "SILVA, L. I. L. da"
- 处理多姓名场景
通过拆分字符串、批量处理、重新拼接实现:
format_multiple_names <- function(names_str) { # 按逗号+空格拆分多个姓名 name_list <- str_split(names_str, ",\\s+")[[1]] # 批量格式化每个姓名后用分号+空格拼接 str_c(map_chr(name_list, format_single_name), collapse = "; ") }
- 测试多姓名格式化
format_multiple_names("Daenerys Targaryen, Luís Inácio Lula da Silva") # [1] "TARGARYEN, D.; SILVA, L. I. L. da"
代码说明
- 正则表达式
\\b[A-ZÀ-ÿ][a-zÀ-ÿ]+$用于匹配最后一个首字母大写的姓氏,兼容带重音的特殊字符; - 提取名的首字母时,匹配所有首字母大写的单词,确保缩写覆盖所有名的部分;
- 小写前缀(如
da)会被识别并追加在名缩写之后,完全符合示例规则; - 使用
purrr::map_chr实现批量处理多姓名,保证代码简洁高效。
内容的提问来源于stack exchange,提问作者Bruno Mioto
相关产品推荐
相关产品推荐

