我的人名数据库有问题。我想将名称缩写,而不要使用姓氏。姓氏用逗号分隔,不同的人用分号分隔,例如以下示例:

Michael, Jordan; Bird, Larry;


如果名称是一个单词,则代码将如下所示:

breve$autor <- str_replace_all(breve$autor, "[:lower:]{1,}\\;", ".\\;")


结果与以下代码:

Michael, J.; Bird, L.;


问题出在化合物名称中。使用此代码,名称:

Jordan, Michael Larry;


这将是:

Jordan, Michael L.;


有人可以告诉我如何删除逗号和分号之间的所有小写字母吗?它看起来像这样:

Jordan, M.L.;

最佳答案

这是另一种解决方案:

x1 <- 'Michael, Jordan; Bird, Larry;'
x2 <- 'Jordan, Michael Larry;'

gsub('([A-Z])[a-z]+(?=[ ;])', '\\1.', x1, perl = TRUE)
# [1] "Michael, J.; Bird, L.;"

gsub('([A-Z])[a-z]+(?=[ ;])', '\\1.', x2, perl = TRUE)
# [1] "Jordan, M. L.;"


姓氏后跟,,部分名称后跟;。在这里,我使用(?=[ ;])来确保要匹配的模式之后的以下字符是空格或分号。

要删除M.L.之间的空间,需要执行另一个步骤:

gsub('\\. ', '.', gsub('([A-Z])[a-z]+(?=[ ;])', '\\1.', x2, perl = TRUE))
# [1] "Jordan, M.L.;"

10-06 10:33