【问题标题】:how to use grep in R to get the specified character?如何在 R 中使用 grep 来获取指定的字符?
【发布时间】:2012-09-18 02:22:45
【问题描述】:

我有

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

我想得到

 "00005.profit"  "00006.profit"

如何在 R 中使用 grep 来实现这一点?

【问题讨论】:

  • 5 位数字后跟.profit?

标签: r regex


【解决方案1】:

这是一种方法:

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() 然后将四个项目减少为两个唯一的项目。

【讨论】:

    【解决方案2】:

    Dirk 的答案几乎是理想的通用答案,但基于您的示例总是有一个 - 字符开始您希望切断的部分这一事实,这里有几个其他选项:

    1:gsub 返回 - 之前的所有内容

    gsub("(.+)-.+","\\1",str)
    

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

    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"
    

    【讨论】:

      【解决方案3】:

      我实际上对您的问题的解释不同。我想你可能想要

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

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

      【讨论】:

        猜你喜欢
        • 2012-10-18
        • 1970-01-01
        • 2023-03-19
        • 2015-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多