在R中的其他两个字符串之间提取字符串

Sas*_*sha 31 regex r stringr

我试图找到一种简单的方法来提取出现在两个已知子串之间的未知子串(可能是任何东西).例如,我有一个字符串:

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

我需要提取GET_MESTR1和STR2之间的字符串(没有空格).

我正在尝试str_extract(a, "STR1 (.+) STR2"),但我得到了整场比赛

[1] "STR1 GET_ME STR2"
Run Code Online (Sandbox Code Playgroud)

我当然可以删除已知的字符串,以隔离我需要的子字符串,但我认为应该有一个更清晰的方法来使用正确的正则表达式.

Wik*_*żew 56

您可以使用str_matchSTR1 (.*?) STR2(注意空间是"有意义的",如果你想只匹配之间的任何东西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"
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)

  • 这里的“?”是* lazy *(非贪婪)量词的一部分。它匹配尽可能少的字符,而“ *”则匹配尽可能多的字符。那么,`STR1。*?STR2`正则表达式匹配“ STR1 xx STR2”,而STR1。* STR2将匹配“ STR1 xx STR2 zzz STR2”。如果您希望输入中有多个匹配项,则必须在这里使用惰性量词。此外,仅供参考:如果STR1和STR2之间的字符串部分可能包含换行符,则需要在模式前加上((?s)`:`“(?s)STR1(。*?)STR2” 。 (2认同)
  • 我也写了一篇关于使用正则表达式提取两个字符串之间的字符串的一般性文章](https://www.buymeacoffee.com/wstribizew/extracting-text-two-strings-regular-expressions),如果您有一个问题接近您当前的类似问题。 (2认同)

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)

  • 你能解释一下“\\1”吗? (2认同)

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”之间。