我需要一种方法来使用'或者'在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?(.)"
但我正在寻找更通用的解决方案。
答案 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