按任意顺序提取2个字

时间:2018-02-02 21:43:51

标签: r regex

我想以任何顺序提取猫狗

string1 <- "aasdfadsf cat asdfadsf dog"
string2 <- "asfdadsfads dog asdfasdfadsf cat"

我现在拥有的是猫和狗,还有中间的文字

stringr::str_extract(string1, "cat.*dog|dog.*cat"

我希望输出为

cat dog

dog cat

分别为string1和string2

3 个答案:

答案 0 :(得分:3)

您可以将sub与以下PCRE正则表达式一起使用:

.*(?|(dog).*(cat)|(cat).*(dog)).*

请参阅regex demo

<强>详情

  • .* - 除了换行符之外的任何0 +字符(以匹配所有字符在模式开始处添加(?s)
  • (?|(dog).*(cat)|(cat).*(dog)) - 与两个备选方案中的任何一个匹配的分支重置组(?|...|...)
    • (dog).*(cat) - 第1组捕获dog,然后捕获尽可能多的0个字符,第2组捕获cat
    • | - 或
    • (cat).*(dog) - 第1组捕获cat,然后捕获尽可能多的0个字符,第2组捕获dog(在分支重置组中,组ID重置为该值在小组前+ 1)
  • .* - 除了换行符之外的任何0 +字符

\1 \2替换模式将第1组和第2组值插入到结果字符串中(结果只有dogcat,空格和{{1} }或cat)。

另见an R demo online

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" ,请使用正则表达式匹配特定模式或整个字符串,并将其与NA一起使用以应用自定义替换逻辑:

gsubfn

在这里,

  • > 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" - 字符串anchor
  • 的开头
  • ^ - non-capturing group与两种选择中的任何一种匹配: (?:.*((dog).*(cat)|(cat).*(dog)).*|.*)
    • .*((dog).*(cat)|(cat).*(dog)).* - 尽可能多的0个字符
    • .* - capturing group匹配两种选择中的任何一种:
      • ((dog).*(cat)|(cat).*(dog)) - (dog).*(cat)(第2组,分配给dog变量),尽可能多的0 +字符,然后a(第3组,分配给cat变量)
      • b
      • | - (cat).*(dog)(第4组,分配给dog变量),尽可能多的0 +字符,然后y(第5组,分配给cat变量)
    • z - 尽可能多的0个字符
      • .* - 或
      • | - 任何0+字符
  • .* - 字符串anchor的结尾。

匿名函数中的$表示第1组值,即&#34;技术&#34;在这里,我们检查组1的匹配长度是否为x不为零,如果它不为空,我们用自定义逻辑替换,如果组1为空,我们用nchar替换。

答案 1 :(得分:2)

我们可以使用包中的str_extract_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)

我们也可以设置simplify = TRUE。输出将是一个矩阵。

str_extract_all(c(string1, string2, string3), pattern = "(dog)|(cat)", simplify = TRUE)
#       [,1]  [,2] 
# [1,] "cat" "dog"
# [2,] "dog" "cat"
# [3,] ""    ""  

答案 2 :(得分:1)

或者,

> regmatches(string1,gregexpr("cat|dog",string1))
[[1]]
[1] "cat" "dog"

> regmatches(string2,gregexpr("cat|dog",string2))
[[1]]
[1] "dog" "cat"