从R中的文本文件中提取模式子串

时间:2014-06-11 11:23:08

标签: regex string r grep pattern-matching

我希望使用R从文本文件中提取所有唯一的文本子字符串,这些字符串符合表格" matrixname [ rowname 列编号]&#34 ;.我只使用grep和extract_string_all(stringr)取得了有限的成功,因为它只返回整行,而不返回子串。尝试使用gsub替换不需要的文本是不成功的。以下是我一直使用的代码示例。

#Read in file
txt<-read.table("Project_R_code.R")
#create new object to create lines that contain this pattern    
txt2<-grep("param\\[.*1\\]",txt$V1, value=TRUE)
#remove all text that does not match the above pattern
gsub("[^param\\[.*1\\]]","", txt2,perl=TRUE)

第二行有效(但同样没有给我一个该模式的子串)。但是,用于删除不匹配模式的gsub代码会保留行并将它们转换为如下所示:

[200] "[p.p]param[ama1]param[ama11]*[r1]param[ama1]...

我不明白为什么。我意识到这种将线条削减成更容易管理的方法更加乏味,但这是我知道如何获得模式的唯一方法。

最好我希望R吐出一个在文本文件中找到的所有(唯一)子串的列表,它与我的模式匹配,但我不知道命令。对此有任何帮助非常感谢。

1 个答案:

答案 0 :(得分:1)

如果您想提取单个组件,请尝试str_match

test <- c("aaa[name1,1]", "bbb[name2,3]", "ccc[name3,3]")
stringr::str_match(test, "([a-zA-Z0-9_]+)[[]([a-zA-Z0-9_]+),.*?(\\d+)\\]")
##      [,1]           [,2]  [,3]    [,4]
## [1,] "aaa[name1,1]" "aaa" "name1" "1" 
## [2,] "bbb[name2,3]" "bbb" "name2" "3" 
## [3,] "ccc[name3,3]" "ccc" "name3" "3" 

否则,请使用str_extract

请注意,为了匹配ERE / TRE中的[,我们使用包含单个[字符的集合,即[[]

此外,如果您在一个字符串中有多个匹配项,请使用str_match_allstr_extract_all