使用 R 和正则表达式重新组合字符串并用句点分隔首字母

问题描述 投票:0回答:1

我有一个作者列表,其格式略有不同。我的目标是提取每个字符串的不同组成部分。不同的组件是:

  • 首字母缩写(通常全部大写字母,后跟句点

  • 姓氏(所有以大写字母开头的单词)

  • 如果存在,姓氏前缀(所有仅由小写字符组成的单词)

接下来我想将所有内容重新组合在一起,以便每个作者和作者列表的格式都完全相同。我更喜欢使用 stringr 的解决方案。

下面是我的数据集的一个小样本。

library(tidyverse)

sample_list <- structure(list(Id = c(22667, 33807), auteur = c("van Bar, A.J.M.",  "de Vogel, J.J., R. Robbing, M.J. Smit & H.L.T. Bergsma-John"),      jaartal = c(1938, 2016)), row.names = c(NA, -2L), class = c("tbl_df",  "tbl", "data.frame"))  

因为单个字符值可以有多个作者,所以我首先拆分数据,以便每一行都引用一个名称。然后,使用多个正则表达式语句,提取每个名称的不同组成部分。到目前为止,请参阅下面的代码。

sample_list |>
 mutate(
  auteur = str_remove(auteur, pattern = ",")) |>
 separate_longer_delim(cols = auteur, delim = regex("\\, | &"),) |>
 mutate(
  auteur = str_squish(auteur),
  initials = auteur |>  
              str_extract(pattern = "(\\b[A-Z\\.]+\\b)") |> 
              str_remove_all(pattern = "\\.") |> 
              str_squish(),     
  last_name = sapply(
               str_extract_all(string = auteur, pattern = "\\b\\p{Lu}(?:\\p{Lu}*\\p{lu})?\\w+"), 
               paste, collapse= ' '),  
  prefix = auteur |> 
            str_extract(pattern = "\\b[a-z](?:[a-z ]*[a-z])?\\b") |> 
            str_squish()
)

这对我有用(也考虑到东欧或北欧常见的特殊字符),但我很难将所有内容重新组合在一起。我首先需要标准化所有名称。我想通过用句点分隔首字母缩写,后跟前缀(如果存在),最后是姓氏来实现此目的。例如: “A.J.M.范巴尔” “J·J·德·沃格尔” “R. 抢劫”

预期产量

最后,每一行都需要代表单个出版物的所有作者(通过使用 Id 列),其中所有作者根据作者数量用逗号或“&”符号分隔。我更喜欢使用 stringr 的解决方案。最终的预期输出应该是这样的:

“A.J.M. 范酒吧”

“J.J. de Vogel、R. Robbing、M.J. Smit 和 H.L.T. Bergsma John”

r regex tidyverse stringr
1个回答
0
投票

您可以在一行中完成(尽管使用复杂的正则表达式):

sample_list %>%
  mutate(auteur = str_replace_all(auteur, "([^,]+),\\s([A-Z]\\.[A-Z]\\.([A-Z]\\.)?(?=$|,\\s?))", "\\2 \\1"))
# A tibble: 2 × 3
     Id auteur                                                     jaartal
  <dbl> <chr>                                                        <dbl>
1 22667 A.J.M. van Bar                                                1938
2 33807 J.J. de Vogel, R. Robbing, M.J. Smit & H.L.T. Bergsma-John    2016
© www.soinside.com 2019 - 2024. All rights reserved.