在 tidyR separate_rows() 及其 "sep" 属性中使用正则表达式不起作用

Using regex in tidyR separate_rows() and its "sep"-attribute does not work

我有这些数据:

df <- data.frame("author" = c("Kardos, NN (Fraunhofer Austria); Laflamme, NN (Fraunhofer Austria); Gallina, NN (Fraunhofer Austria); Sihn, NN (Fraunhofer Austria; TU Wien)", 
        "Demeter, NN (TU Wien; TU Wien); Derx, NN (TU Wien); Komma, NN (TU Wien); Parajka, NN (TU Wien); Schijven, NN (National Institute for Public Health and the Environment; Utrecht University); Sommer, NN (Medical University of Vienna)",
        "Prendl, NN (TU Wien); Schenzel, NN (TU Wien); Hofmann, NN (TU Wien)", 
        "Müller, NN (TU Wien); Knoll, NN (TU Wien; TU Wien); Gravogl, NN (TU Wien; University of Vienna); Jordan, NN (TU Wien); Eitenberger, NN (TU Wien); Friedbacher, NN (TU Wien); Artner, Werner (TU Wien); Welch, NN M. (TU Wien); Werner, NN (TU Wien)"
))

使用特定的正则表达式(我从 获得),我能够提取每个人。这很好用:

stringr::str_extract_all(df$author, "\w+,\s*\w+\s*\([^()]*(?:\([^()]*\)[^()]*)*\);?")

但是,当我使用 tidyr::separate_rows():

时,相同的正则表达式不起作用
tidyr::separate_rows(df, author, sep = "\w+,\s*\w+\s*\([^()]*(?:\([^()]*\)[^()]*)*\);?")

怎么来的?这里的问题是什么?如何将正则表达式与 separate_rows() 一起使用?

一种方法是将 df 的行重复提取值的 lengths

values <- stringr::str_extract_all(df$author, "\w+,\s*\w+\s*\([^()]*(?:\([^()]*\)[^()]*)*\);?")

result <- transform(df[rep(seq(nrow(df)), lengths(values)), ], author = unlist(values))

这里的要点是,用于提取 文本的正则表达式与您需要获取的文本相匹配。拆分函数中使用的正则表达式 删除 匹配项并在匹配项的位置拆分原始字符串。

您可以使用

tidyr::separate_rows(df, author, sep = "(?<=\));\s*")

regex demo

详情

  • (?<=\)) - 紧接在 )
  • 之前的位置
  • ; - 一个分号
  • \s* - 零个或多个空格。

找到这些匹配项,separate_rows 将在匹配项出现的地方拆分原始字符串,同时删除匹配文本。