Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按任意顺序提取2个单词_R_Regex_Stringr - Fatal编程技术网

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个字符
    • ((狗)。*(猫)|(猫)。*(狗))
      -匹配两个备选方案之一:
      • (狗)。*(猫)
        -
        dog
        (第2组,分配给
        a
        变量),尽可能多的0+字符,然后
        cat
        (第3组,分配给
        b
        变量)
      • |
      • (猫)。*(狗)
        -
        dog
        (第4组,分配给
        y
        变量),尽可能多的0+字符,然后
        cat
        (第5组,分配给
        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"