簡體   English   中英

以任意順序提取2個單詞

[英]Extract 2 words in any order

我想以任何順序提取貓和狗

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

我現在提取的是貓和狗,還有兩者之間的文字

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

我希望輸出是

cat dog

dog cat

分別用於string1和string2

您可以將sub與以下PCRE正則表達式一起使用:

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

參見regex演示

細節

  • .* -除換行符以外的任何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替換模式將Group 1和Group 2的值插入到結果字符串中(這樣,結果就是dogcat ,一個空格以及catdog )。

也可以在線觀看R演示

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以應用自定義替換邏輯:

> 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"

這里,

  • ^ -字符串錨點的開始
  • (?:.*((dog).*(cat)|(cat).*(dog)).*|.*) -與兩個選項之一匹配的非捕獲組.*((dog).*(cat)|(cat).*(dog)).*
    • .* -盡可能多的0個字符
    • ((dog).*(cat)|(cat).*(dog)) -與兩個選項之一匹配的捕獲組
      • (dog).*(cat) - dog (第2組,分配給a變量),任何0+字符盡可能多,然后cat (第3組,分配給b變量)
      • |
      • (cat).*(dog) dog (第4組,分配給y變量),盡可能多的0個字符,然后cat (第5組,分配給z變量)
    • .* -盡可能多的0個字符
      • | - 要么
      • .* -任何0+個字符
  • $ -字符串錨點的結尾。

匿名函數中的x表示此處的“技術”組1值,我們用nchar檢查組1的匹配長度是否不為零,如果不為空,則用自定義邏輯替換,如果組1為空,我們用NA代替。

我們可以使用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,] ""    ""  

要么,

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM