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()))
我对正则表达式模式感到困惑,我需要 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()))