在第一个/第n个分隔符出现时拆分

Tyl*_*ker 9 regex r

我正在尝试一些我认为很容易的事情.我正在寻找一个单一的正则表达式解决方案(尽管其他人欢迎完整性).我想拆分n次出现的分隔符.

这是一些数据:

x <- "I like_to see_how_too"
pat <- "_"
Run Code Online (Sandbox Code Playgroud)

期望的结果

假设我想在第一次出现时拆分_:

[1] "I like"  "to see_how_too"
Run Code Online (Sandbox Code Playgroud)

假设我想在第二次出现时拆分_:

[1] "I like_to see"   "how_too"
Run Code Online (Sandbox Code Playgroud)

理想情况下,如果解决方案是正则表达式,可以推广到第n次; 该解决方案将使用strsplit单个正则表达式.

这是一个不适合我的单正则表达式参数的解决方案 strsplit

x <- "I like_to see_how_too"
y <- "_"
n <- 1
loc <- gregexpr("_", x)[[1]][n]

c(substr(x, 1, loc-1), substr(x, loc + 1, nchar(x)))
Run Code Online (Sandbox Code Playgroud)

hwn*_*wnd 6

这是使用gsubfn包和一些正则表达式的另一种解决方案.要更改nth分隔符的出现次数,您只需交换放置在范围量词内的数字 - {n}.

library(gsubfn)
x <- 'I like_to see_how_too'
strapply(x, '((?:[^_]*_){1})(.*)', c, simplify =~ sub('_$', '', x))
# [1] "I like"  "to see_how_too"
Run Code Online (Sandbox Code Playgroud)

如果您希望第n个匹配项是用户定义的,则可以使用以下命令:

n <- 2
re <- paste0('((?:[^_]*_){',n,'})(.*)')
strapply(x, re, c, simplify =~ sub('_$', '', x))
# [1] "I like_to see" "how_too" 
Run Code Online (Sandbox Code Playgroud)