从R中的字符串中提取模式的多个实例

时间:2015-05-12 05:12:20

标签: regex r

我有一个字符向量t,如下所示。

t <- c("GID456 SPK711", "GID456 GID667 VINK", "GID45345 DNP990 GID2345", 
    "GID895 GID895 K350")

我想提取所有以GID开头的字符串,然后是一系列数字。

这样可行,但不会检索多个实例。

gsub(".*(GID\\d+).*", "\\1", t)
[1] "GID456"  "GID667"  "GID2345" "GID895" 

在这种情况下如何提取所有字符串?所需的输出如下

out <- c("GID456", "GID456", "GID667", "GID45345", "GID2345", 
        "GID895", "GID895")

4 个答案:

答案 0 :(得分:11)

这是一种使用包的方法我维护qdapRegex(我更喜欢这个或stringi / stringr)来保持一致性和易用性。我还展示了一种基本方法。无论如何,我更多地将其视为&#34;提取&#34;问题而不是问题。

y <- c("GID456 SPK711", "GID456 GID667 VINK", "GID45345 DNP990 GID2345", 
    "GID895 GID895 K350")

library(qdapRegex)
unlist(ex_default(y, pattern = "GID\\d+"))

## [1] "GID456"   "GID456"   "GID667"   "GID45345" "GID2345"  "GID895"   "GID895" 

在基地R:

unlist(regmatches(y, gregexpr("GID\\d+", y)))

答案 1 :(得分:3)

通过gsub

> t <- c("GID456 SPK711", "GID456 GID667 VINK", "GID45345 DNP990 GID2345", 
+        "GID895 GID895 K350")
> unlist(strsplit(gsub("(GID\\d+)|.", "\\1 ", t), "\\s+"))
[1] "GID456"   "GID456"   "GID667"   "GID45345" "GID2345" 
[6] "GID895"   "GID895"

答案 2 :(得分:1)

我使用了str_split

中的stringr函数
library(stringr)
word.list = str_split(t, '\\s+') 
new_list <- unlist(word.list)
new_list[grep("GID", new_list)]

我希望这会有所帮助。

答案 3 :(得分:1)

我迟到了,但这个整齐的单行可能对某人有用。

使用stringr + dplyr:

t <- c("GID456 SPK711", "GID456 GID667 VINK", "GID45345 DNP990 GID2345", "GID895 GID895 K350")
str_extract_all(t, regex("GID\\d+")) %>% unlist()

给出:

[1] "GID456" "GID456" "GID667" "GID45345" "GID2345" "GID895" "GID895"