根据单词列表拆分字符串

Split string base on a list of words

假设我有一列:

是否有简单的方法使用 tidyverse 根据模式列表将列拆分为两列?

例如,列表将包含 c(ATOM、SOL、BUSD、UNI),并且基于此列表,列将像这样拆分

谢谢

PS:我只能以非常复杂的方式搜索和删除模式来执行此操作,因此我正在寻找更简单的解决方案。

这样的事情怎么样:

    rx <- "^(ATOM|SOL|BUSH|UNI)(.*)$"
    d %>% cbind( str_match( .$Pair, rx )[,-1] )

tidyr::separate 和零宽度正则表达式 可能 有效,但不支持可变宽度零宽度模式。有一段时间了。真是太可惜了。

这是一个想法。我们可以构造正确的正则表达式调用,然后使用extract拆分数据。在这个例子中,我假设场景是您需要找到第一列包含 target_string 中的字符串,同时将所有内容保留在第二个字符串中。

library(tidyverse)

target_string <- c("ATOM", "SOL", "UNI")
target_regex <- paste0("(", paste0(paste0("^", target_string), collapse = "|"), ")(.*)")

dat2 <- dat %>%
  extract(Text, into = c("Col1", "Col2"), regex = target_regex)
dat2
# # A tibble: 5 x 2
#   Col1  Col2 
#   <chr> <chr>
# 1 ATOM  BUSD 
# 2 SOL   BTC  
# 3 SOL   BUSD 
# 4 SOL   BUSD 
# 5 UNI   BUSD 

数据

dat <- tribble(
  ~Text,
  "ATOMBUSD",
  "SOLBTC",
  "SOLBUSD",
  "SOLBUSD",
  "UNIBUSD"
)

创建一串模式并使用str_extract_all提取相关关键字。

使用@www 的数据:

library(stringr)
target_string <- c("ATOM", "SOL", "UNI", "BUSD", "BTC")
do.call(rbind, str_extract_all(dat$Text, str_c(target_string, collapse = '|')))

#       [,1]   [,2]  
#[1,] "ATOM" "BUSD"
#[2,] "SOL"  "BTC" 
#[3,] "SOL"  "BUSD"
#[4,] "SOL"  "BUSD"
#[5,] "UNI"  "BUSD"

或类似的基础 R 方式:

do.call(rbind, regmatches(dat$Text, gregexpr(paste0(target_string, collapse = '|'), dat$Text)))