我有
str=c("00005.profit", "00005.profit-in","00006.profit","00006.profit-in")
我想得到
"00005.profit" "00006.profit"
我怎样才能grep
在 R 中实现这一点?
这是一种方法:
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
,我们通过将表达式保留在括号中来分配它。然后\\1
回忆起第一个这样的任务——我们什么都不记得,这就是我们得到的。然后unique()
将四个项目减少为两个唯一的项目。
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"
我实际上对您的问题的解释不同。我想你可能想要
grep("[0-9]+\\.profit$",str,value=TRUE)
也就是说,如果您只想要以 .结尾的字符串profit
。特殊字符代表“$
字符串结尾”,因此它不包括末尾有其他字符的情况......这\\.
意味着“我真的想匹配一个点,而不是任何字符”(a.
本身将匹配任何字符)。您并不完全清楚您的目标模式——您可能更喜欢"0+[1-9]\\.profit$"
(任意数量的零后跟一个非零数字),甚至"0{4}[1-9]\\.profit$"
(4 个零后跟一个非零数字)。