如何在R中使用grep来获取指定的字符?

时间:2012-09-18 02:22:46

标签: r grep

我有

str=c("00005.profit", "00005.profit-in","00006.profit","00006.profit-in")  

我希望得到

 "00005.profit"  "00006.profit"

如何在R中使用grep实现此目的?

3 个答案:

答案 0 :(得分:8)

这是一种方式:

R> s <- c("00005.profit", "00005.profit-in","00006.profit","00006.profit-in")
> unique(gsub("([0-9]+.profit).*", "\\1", s))
[1] "00005.profit" "00006.profit"
R> 

我们将正则表达式定义为数字,后跟.profit,我们通过将表达式保留在parantheses中来指定。然后\\1回忆起第一个这样的任务 - 我们回想起我们得到的任何其他内容。 unique()然后将四个项目减少为两个唯一项目。

答案 1 :(得分:4)

Dirk的答案几乎是一个理想的通用答案,但是这里有几个其他选项,因为你的例子总是有一个-个字符,从你想要切断的部分开始:

1:gsub返回-

之前的所有内容
gsub("(.+)-.+","\\1",str)

2:strsplit -,只保留第一部分。

sapply(strsplit(str,"-"),head,1)

两者都返回:

[1] "00005.profit" "00005.profit" "00006.profit" "00006.profit"

然后您可以在unique中换行以不返回重复项,如:

unique(gsub("(.+)-.+","\\1",str))
unique(sapply(strsplit(str,"-"),head,1))

然后会返回:

[1] "00005.profit" "00006.profit"

另一个不可通用的解决方案是只取前12个字符(假设您要保留的部分的字符串长度不会改变):

unique(substr(str,1,12))
[1] "00005.profit" "00006.profit"

答案 2 :(得分:3)

我实际上是以不同的方式解释你的问题。我认为你可能想要

grep("[0-9]+\\.profit$",str,value=TRUE)

也就是说,如果您只想要结束的字符串profit$特殊字符代表“字符串结尾”,因此它排除了末尾有其他字符的情况...... \\.表示“我真的想要匹配一个点,而不是任何字符匹配所有“(.本身将与任何角色匹配)。你并不完全清楚你的目标模式 - 你可能更喜欢"0+[1-9]\\.profit$"(任意数量的零后跟一个非零数字),甚至"0{4}[1-9]\\.profit$"(4个零后跟一个非零) - 零数字。)