我试图找到一种简单的方法来提取出现在两个已知子串之间的未知子串(可能是任何东西).例如,我有一个字符串:
a<-" anything goes here, STR1 GET_ME STR2, anything goes here"
我需要提取GET_ME
STR1和STR2之间的字符串(没有空格).
我正在尝试str_extract(a, "STR1 (.+) STR2")
,但我得到了整场比赛
[1] "STR1 GET_ME STR2"
Run Code Online (Sandbox Code Playgroud)
我当然可以删除已知的字符串,以隔离我需要的子字符串,但我认为应该有一个更清晰的方法来使用正确的正则表达式.
Wik*_*żew 56
您可以使用str_match
与STR1 (.*?) STR2
(注意空间是"有意义的",如果你想只匹配之间的任何东西STR1
和STR2
使用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"
Run Code Online (Sandbox Code Playgroud)
使用基数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"
Run Code Online (Sandbox Code Playgroud)
Uli*_*uri 15
这是使用基数R的另一种方法
a<-" anything goes here, STR1 GET_ME STR2, anything goes here"
gsub(".*STR1 (.+) STR2.*", "\\1", a)
Run Code Online (Sandbox Code Playgroud)
输出:
[1] "GET_ME"
Run Code Online (Sandbox Code Playgroud)
Ron*_*hah 11
另一种选择是用于qdapRegex::ex_between
提取左右边界之间的字符串
qdapRegex::ex_between(a, "STR1", "STR2")[[1]]
#[1] "GET_ME"
Run Code Online (Sandbox Code Playgroud)
它也适用于多次出现
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"
Run Code Online (Sandbox Code Playgroud)
或者多个左右边界
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"
Run Code Online (Sandbox Code Playgroud)
第一个捕获在“STR1”和“STR2”之间,而第二个在“STR4”和“STR5”之间。