R - select 第 n 次出现正则表达式匹配

R - select nth occurence of regex match

我对正则表达式模式感到困惑,我需要 select 字符串的第二个空格。我已经尝试了 google 的前 5 页,我想出的只是 select 直到第二个空格之前的所有内容,我只想 select 第二个空格本身。

这是我目前所拥有的。

txt <- "the duck is yellow"
str_extract(txt,"(?:[\w]*)(?:[\s])(?:[\w]*)([\s])")

我试过的另一个正则表达式是:

(\w+\s\w+\s){2}

我只是找不到解释如何获得某个字符第二次出现的来源。我以为这样的事情会很简单。

最终我想在第二个空格处将文本分成两列。

要在第二个 space 拆分单词,我建议在这里使用 sub

txt <- "the duck is yellow"
first <- sub("^(\w+ \w+).*$", "\1", txt)
second <- sub("^\w+ \w+\s*", "", txt)
first
[1] "the duck"

second
[1] "is yellow"

但是,如果您需要在第 n 个 space 处拆分,则这种方法可能会变得笨拙,埋在字符串的某个地方。对于更通用的方法,我们可以尝试使用 strsplit,然后拼凑这些术语:

parts <- strsplit(txt, " ")
pos <- 2
first <- paste(parts[[1]][1:pos], collapse=" ")                        # "the duck"
second <- paste(parts[[1]][(pos+1):length(parts[[1]])], collapse=" ")  # "is yellow"

要将数据分成两列,在第二个空格处拆分,您可以尝试使用 tidyr::extract

df <- data.frame(txt = "the duck is yellow")
tidyr::extract(df, txt, c('first', 'second'), '(\w+\s\w+)\s(.*)')

#     first    second
#1 the duck is yellow

或者 strcapture 使用基数 R :

strcapture('(\w+\s\w+)\s(.*)', df$txt, 
           proto = list(first = character(), second = character()))