![](/img/trans.png)
[英]R - Extract words with a pattern and replace them with the words in inverse order
[英]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的值插入到結果字符串中(這樣,結果就是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"
要在不匹配的情況下返回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
從stringr包捕獲組。
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.