web-dev-qa-db-ja.com

Rの他の2つの文字列の間の文字列を抽出する

2つの既知の部分文字列の間に現れる未知の部分文字列(何でもかまいません)を抽出する簡単な方法を見つけようとしています。たとえば、文字列があります:

_a<-" anything goes here, STR1 GET_ME STR2, anything goes here"_

STR1とSTR2の間にある文字列_GET_ME_を抽出する必要があります(空白なし)。

str_extract(a, "STR1 (.+) STR2")を試していますが、完全に一致しています

_[1] "STR1 GET_ME STR2"
_

もちろん、必要な部分文字列を分離するために、既知の文字列を削除することもできますが、正しい正規表現を使用することで、よりクリーンな方法があるはずです。

25
Sasha

STR1 (.*?) STR2str_matchを使用できます(STR1STR2の間にあるものと一致させたい場合、スペースは「意味のある」ことに注意してくださいSTR1(.*?)STR2)。複数ある場合は、str_match_allを使用します。

library(stringr)
a<-" anything goes here, STR1 GET_ME STR2, anything goes here"
res <- str_match(a, "STR1 (.*?) STR2")
res[,2]
[1] "GET_ME"

ベースR regexecを使用する別の方法(最初の一致を取得する):

test = " anything goes here, STR1 GET_ME STR2, anything goes here STR1 GET_ME2 STR2"
pattern="STR1 (.*?) STR2"
result <- regmatches(test,regexec(pattern,test))
result[[1]][2]
[1] "GET_ME"
46

ベースRを使用する別の方法を次に示します

a<-" anything goes here, STR1 GET_ME STR2, anything goes here"

gsub(".*STR1 (.+) STR2.*", "\\1", a)

出力:

[1] "GET_ME"
10

別のオプションは、qdapRegex::ex_betweenは、左右の境界間の文字列を抽出します

qdapRegex::ex_between(a, "STR1", "STR2")[[1]]
#[1] "GET_ME"

また、複数のオカレンスで機能します

a <- "anything STR1 GET_ME STR2, anything goes here, STR1 again get me STR2"

qdapRegex::ex_between(a, "STR1", "STR2")[[1]]
#[1] "GET_ME"       "again get me"

または、左右の複数の境界

a <- "anything STR1 GET_ME STR2, anything goes here, STR4 again get me STR5"
qdapRegex::ex_between(a, c("STR1", "STR4"), c("STR2", "STR5"))[[1]]
#[1] "GET_ME"       "again get me"

最初のキャプチャは「STR1」と「STR2」の間で、2番目のキャプチャは「STR4」と「STR5」の間です。

1
Ronak Shah