【问题标题】:split string by multiple characters按多个字符拆分字符串
【发布时间】:2018-07-19 06:15:21
【问题描述】:

我想通过向量中定义的多个分隔符来分割一个字符:

text1   <- "aweoiutw839572/)(&2aslk2468" 
text2   <- "147we547iu5erhg24tzu" 
dat <-  rbind(text1, text2)
vector <- c("we", "iu", "24")

结果应该是:

var1 del1 var2 del2  var3                del3 var4
a    we   o    iu    tw839572/)(&2aslk   24   68
147  we   547  iu    5erhg               24   tzu

strsplit 有什么想法吗?

【问题讨论】:

标签: r character delimiter strsplit


【解决方案1】:

我们可以在这里使用strsplit 并使用以下模式进行环视:

(?<=we|is|24)|(?<=.)(?=we|iu|24)

上述正则表达式的基本思想是,只要在当前位置,we|is|24 在之前或继续,就应该进行拆分。值得注意的是外部交替左侧的额外后视(?&lt;=.)。这是必需的,因为 R 在strsplit 中实现前瞻的方式有一个怪癖。 See here 了解更多信息。

text1 <- "aweoiutw839572/)(&2aslk2468"
vector <- c("we", "iu", "24")
terms <- paste0(vector, collapse="|")
regex <- paste0("(?<=", terms, ")|(?<=.)(?=", terms, ")")

strsplit(text1, regex, perl=TRUE)

[[1]]
[1] "a"                 "we"                "o"                
[4] "iu"                "tw839572/)(&2aslk" "24"               
[7] "68"               

Demo

【讨论】:

  • 不错!我正在考虑类似的事情,但我无法完全弄清楚前瞻。你能解释一下为什么它必须在(?&lt;=.)后面加上“任何”前缀吗?
  • @MikkoMarttila 我刚刚更新了我的答案,并附上了一个讨论这个问题的链接。尝试删除(?&lt;=.),你会发现它失败了。
  • 是的,谢谢,读懂我的想法:D 我确实试了一下,但很困惑,尤其是。因为在例如测试正则表达式regex101.com 似乎应该可以工作。我去看看链接!
【解决方案2】:

你可以使用gsub将向量粘贴在一起得到(we|iu|24)。这是我们需要的模式因此我们paste(vector,collapse = "|") 得到we|iu|24 然后我们粘贴()。我们将其中任何一个捕获为第 1 组,并将其替换为反向引用 \\1。我们最后使用了 read.table 函数

 read.table(text=gsub(paste0("(",paste(vector,collapse = "|"),")")," \\1 ",dat))

   V1 V2  V3 V4                V5 V6  V7
1   a we   o iu tw839572/)(&2aslk 24  68
2 147 we 547 iu             5erhg 24 tzu

【讨论】:

  • 您可以包含姓名:read.table(text=gsub(paste0("(",paste(vector,collapse = "|"),")")," \\1 ",dat),col.names= paste0(c("Var","del"),rep(1:4,each=2,length=7)))
【解决方案3】:

受 Onyambu 的启发,专注于易处理性:

library(magrittr)
vecapsed <- sprintf("(%s)", paste(vector, collapse = "|"))
# "(we|iu|24)"

dats <- gsub(vecapsed, "|\\1|", dat[, 1]) %>% 
  strsplit(., "|", fixed = TRUE) %>%
  do.call(rbind, .)

# resulting in:
      [,1]  [,2] [,3]  [,4] [,5]                [,6] [,7] 
text1 "a"   "we" "o"   "iu" "tw839572/)(&2aslk" "24" "68" 
text2 "147" "we" "547" "iu" "5erhg"             "24" "tzu"

# The column names:
del <- apply(dats, 2, function(x) all(x %in% vector))
colnames(dats) <- make.unique(ifelse(del, "del", "var"))

      var   del  var.1 del.1 var.2               del.2 var.3
text1 "a"   "we" "o"   "iu"  "tw839572/)(&2aslk" "24"  "68" 
text2 "147" "we" "547" "iu"  "5erhg"             "24"  "tzu"

【讨论】:

    猜你喜欢
    • 2012-03-05
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    相关资源
    最近更新 更多