R 按任意顺序提取2个单词
我想按任何顺序提取猫和狗R 按任意顺序提取2个单词,r,regex,stringr,R,Regex,Stringr,我想按任何顺序提取猫和狗 string1 <- "aasdfadsf cat asdfadsf dog" string2 <- "asfdadsfads dog asdfasdfadsf cat" 我希望输出是 cat dog 及 对于string1和string2,我们可以分别使用带有捕获组的包中的str\u extract\u all string1 <- "aasdfadsf cat asdfadsf dog" string2 <- "asfdadsfads d
string1 <- "aasdfadsf cat asdfadsf dog"
string2 <- "asfdadsfads dog asdfasdfadsf cat"
我希望输出是
cat dog
及
对于string1和string2,我们可以分别使用带有捕获组的包中的
str\u extract\u all
string1 <- "aasdfadsf cat asdfadsf dog"
string2 <- "asfdadsfads dog asdfasdfadsf cat"
string3 <- "asfdadsfads asfdadsfadf"
library(stringr)
str_extract_all(c(string1, string2, string3), pattern = "(dog)|(cat)")
# [[1]]
# [1] "cat" "dog"
#
# [[2]]
# [1] "dog" "cat"
#
# [[3]]
# character(0)
您可以将
sub
与以下PCRE正则表达式一起使用:
.*(?|(dog).*(cat)|(cat).*(dog)).*
看
详细信息
-除换行符以外的任何0+字符(要匹配所有字符,请在图案开始处添加*
)(?s)
-分支重置组(?|(狗)。*(猫)|(猫)。*(狗))
匹配两个备选方案之一:(?|…|…)
-第1组捕获(狗)。*(猫)
,然后尽可能多地捕获任何0+字符,第2组捕获狗
猫
-或|
-第1组捕获(猫)。*(狗)
,然后尽可能多地捕获任何0+字符,第2组捕获猫
(在分支重置组中,组ID重置为组+1之前的值)狗
-除换行符以外的任何0+字符*
\1\2
替换模式将组1和组2的值插入结果字符串中(这样结果就是dog
或cat
、空格和cat
或dog
)
也见:
这里,
-字符串的开头^
-匹配以下两种选择之一的一种:(?:.*((狗)。*(猫)|(猫)。*(狗))..*|*)
:*((狗)。*(猫)|(猫)。*(狗))。
-尽可能多的任意0个字符*
-匹配两个备选方案之一:((狗)。*(猫)|(猫)。*(狗))
-(狗)。*(猫)
(第2组,分配给dog
变量),尽可能多的0+字符,然后a
(第3组,分配给cat
变量)b
|
-(猫)。*(狗)
(第4组,分配给dog
变量),尽可能多的0+字符,然后y
(第5组,分配给cat
变量)z
-尽可能多的任意0个字符*
-或|
-任何0+字符*
-字符串的结尾$
x
表示组1的“技术”值,我们用nchar
检查组1匹配长度是否为零,如果不为空,我们用自定义逻辑替换,如果组1为空,我们用NA
替换
> regmatches(string1,gregexpr("cat|dog",string1))
[[1]]
[1] "cat" "dog"
> regmatches(string2,gregexpr("cat|dog",string2))
[[1]]
[1] "dog" "cat"
您确定两者都应该是
dog-cat
?我可以为string1获取cat-dog
,为string2获取dog-cat
。或者您想为string1获取狗
,为string2获取猫
?嗨,Wiktor,是的,这就是我的意思。谢谢你的澄清。将根据需要编辑OP。请查看我的更新。我已将函数从str_extract
更改为str_extract_all
以捕获所有组。我希望这能满足我的需要,因为它非常优雅。然而,如果猫和狗都不在场,我想回去NA@matsuo_basho请看我的更新。当没有猫和狗时,函数返回字符(0)
或”
取决于simplify=TRUE
。稍后,您可能想用NA
替换它们。我的意思是,我希望为以下字符串返回NA:“adsfafsf dog asfdadsf”,“asdfadsf cat asdfadsf”我想您想说的是“dog或cat不存在”。对不起,我不是以英语为母语的人,但我认为您没有提供足够的信息说明您的要求。由于我的输出符合您在您的帖子中期望的输出,并且您已经找到了您想要的答案,所以我不会修改我的帖子。干杯,威克托,非常感谢。唉,我发现了一些东西。如果我的搜索字符串要求现在是“dog”和“giraffe”,那么“aasdfadsf cat asdfadsf dog”的测试字符串将返回“aasdfadsf cat asdfadsf dog”,而我希望它返回NA谢谢。你能解释一下正则表达式的语法,特别是“(?:”。另外,函数中i参数的用途是什么?stripply
在这里可能也很有用。
str_extract_all(c(string1, string2, string3), pattern = "(dog)|(cat)", simplify = TRUE)
# [,1] [,2]
# [1,] "cat" "dog"
# [2,] "dog" "cat"
# [3,] "" ""
.*(?|(dog).*(cat)|(cat).*(dog)).*
x <- c("aasdfadsf cat asdfadsf dog", "asfdadsfads dog asdfasdfadsf cat")
sub(".*(?|(dog).*(cat)|(cat).*(dog)).*", "\\1 \\2", x, perl=TRUE)
## => [1] "cat dog" "dog cat"
> gsubfn("^(?:.*((dog).*(giraffe)|(giraffe).*(dog)).*|.*)$", function(x,a,b,y,z,i) ifelse(nchar(x)>0, paste0(a,y," ",b,z), NA), x)
[1] "NA" "NA"
> gsubfn("^(?:.*((dog).*(cat)|(cat).*(dog)).*|.*)$", function(x,a,b,y,z,i) ifelse(nchar(x)>0, paste0(a,y," ",b,z), NA), x)
[1] "cat dog" "dog cat"
> regmatches(string1,gregexpr("cat|dog",string1))
[[1]]
[1] "cat" "dog"
> regmatches(string2,gregexpr("cat|dog",string2))
[[1]]
[1] "dog" "cat"