如何在R中的两个字符之间提取文本

时间:2018-07-24 20:27:26

标签: r regex string

对于所有出现的模式,我想在两个字符串之间提取文本。例如,我有以下字符串:

x<- "\nTYPE:    School\nCITY:   ATLANTA\n\n\nCITY:   LAS VEGAS\n\n" 

我想这样提取单词ATLANTALAS VEGAS

[1] "ATLANTA"   "LAS VEGAS"

我尝试使用gsub(".*CITY:\\s|\n","",x)。产生的输出是:

[1] "  LAS VEGAS"

我想输出两个城市(数据中的某些模式包括两个以上的城市),并在没有前导空格的情况下输出它们。
我也尝试了qdapRegex软件包,但无法关闭。我对正则表达式不太满意,因此将不胜感激。

3 个答案:

答案 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+个字符。

请参见regex demo online

请注意,由于它是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"