对于所有出现的模式,我想在两个字符串之间提取文本。例如,我有以下字符串:
x<- "\nTYPE: School\nCITY: ATLANTA\n\n\nCITY: LAS VEGAS\n\n"
我想这样提取单词ATLANTA
和LAS VEGAS
:
[1] "ATLANTA" "LAS VEGAS"
我尝试使用gsub(".*CITY:\\s|\n","",x)
。产生的输出是:
[1] " LAS VEGAS"
我想输出两个城市(数据中的某些模式包括两个以上的城市),并在没有前导空格的情况下输出它们。
我也尝试了qdapRegex软件包,但无法关闭。我对正则表达式不太满意,因此将不胜感激。
答案 0 :(得分:2)
您可以使用
> unlist(regmatches(x, gregexpr("CITY:\\s*\\K.*", x, perl=TRUE)))
[1] "ATLANTA" "LAS VEGAS"
在这里,CITY:\s*\K.*
个正则表达式匹配
CITY:
-文字子字符串CITY:
\s*
-超过0个空格\K
-match reset operator丢弃到目前为止已匹配的文本(将当前匹配的内存缓冲区清零).*
-尽可能多的除换行符以外的0+个字符。请注意,由于它是PCRE正则表达式,所以perl=TRUE
是必不可少的。
答案 1 :(得分:2)
另一个选择:
library(stringr)
str_extract_all(x, "(?<=CITY:\\s{3}).+(?=\\n)")
[[1]]
[1] "ATLANTA" "LAS VEGAS"
读取为:提取任何以“ City:”(和三个空格)开头,后跟“ \ n”的内容
答案 2 :(得分:0)
一个选项可以是:
regmatches(x,gregexpr("(?<=CITY:).*(?=\n\n)",x,perl = TRUE))
# [[1]]
# [1] " ATLANTA" " LAS VEGAS"