【问题标题】:Regular expressions in R to erase all characters after the first space?R中的正则表达式删除第一个空格后的所有字符?
【发布时间】:2011-09-08 13:29:00
【问题描述】:

我在 R 中有如下数据:

USDZAR Curncy
R157 Govt
SPX Index

换句话说,一个单词,在本例中为 Bloomberg 证券标识符,后跟另一个单词,即证券类别,以空格分隔。我想去掉课程和空间:

USDZAR
R157
SPX

在 R 中最有效的方法是什么?是正则表达式还是我必须像在 MS Excel 中那样使用 mid 和 find 命令做一些事情?例如在 Excel 中我会说:

=MID(@REF, 1, FIND(" ", @REF, 1)-1)

表示返回一个子字符串,从字符 1 开始,到第一个空格的字符号结束(减去 1 以擦除实际空格)。

我是否需要在 R 中做类似的事情(在这种情况下,什么是等价的),或者正则表达式可以在这里提供帮助吗?谢谢。

【问题讨论】:

    标签: regex r


    【解决方案1】:

    1) 试试这个,正则表达式匹配一个空格,后跟任何字符序列,sub 用一个零字符的字符串替换它:

    x <- c("USDZAR Curncy", "R157 Govt", "SPX Index")
    sub(" .*", "", x)
    ## [1] "USDZAR" "R157"   "SPX"  
    

    2) 如果您希望将两个单词放在数据框中的不同列中,另一种方法如下。这里as.is = TRUE 使列成为字符而不是因子。

    read.table(text = x, as.is = TRUE)
    ##       V1     V2
    ## 1 USDZAR Curncy
    ## 2   R157   Govt
    ## 3    SPX  Index
    

    【讨论】:

      【解决方案2】:

      stringr 非常简单:

      x <- c("USDZAR Curncy", "R157 Govt", "SPX Index")
      
      library(stringr)
      str_split_fixed(x, " ", n = 2)[, 1]
      

      【讨论】:

        【解决方案3】:

        如果你像我一样,在那个正则表达式中将永远是一个难以理解、令人沮丧的谜团,这个笨重的解决方案也存在:

        x <- c("USDZAR Curncy", "R157 Govt", "SPX Index")
        unlist(lapply(strsplit(x," ",fixed=TRUE),"[",1))
        

        fixed=TRUE 不是绝对必要的,只是指出您可以做到这一点(简单的情况),而无需真正了解正则表达式的第一件事。

        编辑以反映@Wojciech 的评论。

        【讨论】:

        • 哈哈是的-谢谢乔兰。 Clunk 风格是我在 Excel 中习惯的风格,因此我想知道我是否应该(最终)学习正则表达式。
        • 这里不需要匿名函数,所以可以简化为 unlist(lapply(strsplit(x," ",fixed=TRUE),"[",1))。
        【解决方案4】:

        正则表达式是搜索:

        \x20.*
        

        并用空字符串替换。

        如果您想知道它是否更快,只需计时。

        【讨论】:

        • 谢谢,对了,我正在输入: > grep("\x20.*", "R157 Govt") 我回来了: [1] 1 ,即值 1。在哪里我从那里去吗?
        • 这种用法的问题是你没有理解反斜杠在正则表达式中是特殊的,因此需要自己“转义”。在模式参数中,它需要在它之前有两个反斜杠。试试看:sub("\\\x20.*", "", "R157 Govt")
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-24
        • 1970-01-01
        • 1970-01-01
        • 2012-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多