如何在tidyr :: extract

时间:2016-02-16 14:46:52

标签: regex r tidyr

我需要一种方法来使用'或者'在tidyr :: extract中捕获组外的整个单词的语句,如下一个示例所示。

假设我有下一个字符串:

string1 <- data.frame (col = "asdnajksdn**thingA**asdnaksjdnajksn")
string2 <- data.frame (col = "asdnajksdn**itemA**asdnaksjdnajksn")

我想用tidyr :: extract()来提取A&#39;和&#39; B&#39;使用相同的正则表达式,但我不想提取&#39; word&#39;或者&#39;事情&#39;,所需的输出将是:

string1 %>% extract(col = 'col', regex = regex, into = "var")
> NewColumn
  "A"

string2 %>% extract(col = 'col', regex = regex, into = "NewColumn")
> NewColumn
  "B"

答案是这样的:

extract(string, col = "col", into = "NewColumn",
        regex = "(word)|(thing)(.)")

但我无法做到这一点,因为它会导致:

NewColumn NA
word      A

我知道在示例中我可以使用类似

的内容
"[ti][ht][ie][nm]g?(.)"

但我正在寻找更通用的解决方案。

1 个答案:

答案 0 :(得分:2)

由于 tidyr extract()会提取捕获组值,因此您可以使用non-capturing group对不想提取的替代项进行分组。

non-capturing group的语法是(?:...)

  

如果您不需要该组捕获其匹配项,则可以将此正则表达式优化为Set(?:Value)?。开括号后面的问号和冒号是创建非捕获组的语法。左括号后面的问号与正则表达式末尾的问号无关。

所以,使用类似的东西:

> library(tidyr)
> string1 <- data.frame (col = "asdnajksdnthingAasdnaksjdnajksn")
> string1 %>% extract(col, c("NewColumn"), "(?:word|thing)(.)")
  NewColumn
1         A