使用 str_split 的模式向量,但同时排除某些模式

use vector of patterns for str_split, but at the same time exclude certain patterns

假设以下数据:

df <- data.frame(x = c("text, mail", "app.phone", "phone-text-mail", "e-mail", "e-mail, phone"))

我现在想将 x 列中的文本分成几个 separators/delimiters。这里我想使用最常见的:",", ".", "-".

但是,这对于术语“电子邮件”来说是有问题的。所以我想知道是否有任何方法可以创建某种排除列表,我可以在其中定义不能拆分的术语。

这就是我的设想:

delims <- c(",", ".", "-")
exclusions <- c("e-mail")

library(tidyverse)
df %>%
  mutate(split_x = str_split(x, delims)) # This would also split "e-mail"

那么我如何在 str_split 函数中定义我的模式,以便它忽略我在 exclusions 中定义的所有术语?

在我的真实示例中,我有更多潜在的分隔符,但也有更多潜在的排除项,因此我正在寻找一种解决方案,我可以将我的排除项作为向量传递。不确定这是否可以通过正则表达式完成,或者我是否需要 1. 在 x 列的任何行中搜索我的排除项的存在,然后不要拆分该行。但是,这对于最后一个示例行会有问题,因为该行在出现“电子邮件”后确实包含有效分隔符。

预期结果:

x                split_x_1    split_x_2    split_x_3
text, mail            text         mail           NA
app.phone              app        phone           NA
phone-text-mail      phone         text         mail
e-mail              e-mail           NA           NA
e-mail, phone       e-mail        phone           NA

我们可以skip他们

lst1 <-  strsplit(df$x, "e-mail(*SKIP)(*F)|[,.-]", perl = TRUE)
df[paste0('split_x_', 1:3)] <- do.call(rbind, lapply(lst1,
         `length<-`, max(lengths(lst1))))

-输出

df
#                x split_x_1 split_x_2 split_x_3
#1      text, mail      text      mail      <NA>
#2       app.phone       app     phone      <NA>
#3 phone-text-mail     phone      text      mail
#4          e-mail    e-mail      <NA>      <NA>
#5   e-mail, phone    e-mail     phone      <NA>