我正在处理R中的长字符串,例如:
string <- "end of section. 3. LESSONS. The previous LESSONS are very important as seen in Figure 1. This text is also important. Figure 1: Blah blah blah".
我想提取第一次出现"LESSONS"和最后一次出现"Figure 1"之间的子字符串,如下所示:
"The previous LESSONS are very important as seen in Figure 1. This text is also important."
我尝试了以下操作,但它在最后一次出现"LESSONS"后返回子字符串,而不是第一次:
gsub(".*LESSONS (.*) Figure 1.*", "\1", string)
#[1] "are very important as seen in Figure 1. This text is also important."
也尝试了以下操作,但它在第一次出现"图1"后剪切了字符串,而不是最后一次:
library(qdapRegex)
ex_between(string, "LESSONS", "Figure 1")
#[[1]]
#[1] ". The previous LESSONS are very important as seen in"
如果有任何帮助,我将不胜感激!
你非常接近。使正则表达式在"LESSONS"
之前的不贪婪,使其与第一个正则表达式匹配。
此外,在这里您只能使用sub
而不能使用gsub
。
sub(".*?LESSONS\.\s*(.*) Figure 1.*", "\1", string)
#[1] "The previous LESSONS are very important as seen in Figure 1. This text is also important."
您可以使用包stringr
中的str_extract
,以及(?<=...)
中的正向后向查找和(?=...)
中的正向前向查找来定义字符串中定义要提取的部分的部分:
str_extract(string, "(?<=LESSONS\.\s).*(?=\sFigure 1)")
[1] "The previous LESSONS are very important as seen in Figure 1. This text is also important."