【问题标题】:Remove periods before the first comma in a string删除字符串中第一个逗号之前的句点
【发布时间】:2013-06-30 05:32:55
【问题描述】:

如何删除这些字符串中第一个逗号之前的句点?

 xx <- c("fefe.3. fregg, ff, 34.gr. trgw", 
          "fefe3. fregg, ff, 34.gr. trgw",
          "fefe3 fregg, ff, 34.gr. tr.gw")

期望的输出:

    "fefe3 fregg, ff, 34.gr. trgw"
    "fefe3 fregg, ff, 34.gr. trgw"
    "fefe3 fregg, ff, 34.gr. tr.gw" 

我从gsub("\\.","", xx)) 开始,它会删除所有句点。如何更改它以指定“仅第一个逗号之前的句点”?

【问题讨论】:

    标签: regex r gsub


    【解决方案1】:

    我觉得这是作弊,但它适用于这个简单的例子......

    xx <- c("fefe.3. fregg, ff, 34.gr. trgw", 
            "fefe3. fregg, ff, 34.gr. trgw",
            "fefe3 fregg, ff, 34.gr. tr.gw")
    
    temp <- strsplit(xx, ",")
    
    sapply(seq_along(temp), function(x) {
      t1 <- gsub("\\.", "", temp[[x]][1])
      paste(t1, temp[[x]][2], temp[[x]][-c(1, 2)], sep = ",")
    })
    # [1] "fefe3 fregg, ff, 34.gr. trgw"  "fefe3 fregg, ff, 34.gr. trgw" 
    # [3] "fefe3 fregg, ff, 34.gr. tr.gw"
    

    上面的基本思想是,既然你只会在逗号之前的第一个块中寻找一个句点,为什么不拆分它并在上面使用基本的gsub,然后将各个部分重新组合在一起.不太可能有效率....

    【讨论】:

    • 非常感谢!这也适用于我的实际用例。我认为可能有一个字符更少的解决方案(我是一个懒惰的打字员),但这让我上路了,在这种情况下,这才是最重要的。再次感谢!
    • @Ben,我确定有,但有时过多地考虑正则表达式会让我脑筋急转弯。 :)
    • 嘿!我确切地知道你的意思。我是一个完整的正则表达式白痴。
    【解决方案2】:

    试试这个:

    gsub("\\.(.*,.*)","\\1", xx)
    [1] "fefe3 fregg, ff, 34.gr. trgw" 
    [2] "fefe3 fregg, ff, 34.gr. trgw" 
    [3] "fefe3 fregg, ff, 34.gr. tr.gw"
    

    正则表达式的工作方式如下:

    • \\. 找句号
    • (.*,.*) 在其他文本中查找逗号,并将其分组
    • \\1指的是第一组

    【讨论】:

    • 感谢您提供的详细信息,我很感激。在您的行中,我仍然在第一项中得到一个句点:"fefe3. fregg, ff, 34.gr. trgw"(当示例数据有点不同时,您可能已经对我的 Q 进行了早期编辑,抱歉造成混淆!)
    • @Ben,你可以在这里嵌套 Andrie 的gsub 并得到你的答案:gsub("\\.(.*,.*)", "\\1", gsub("\\.(.*,.*)", "\\1", xx))。这取决于您是否知道在第一个逗号之前可以预期多少个句点,或者取决于您编写递归函数的技能......
    • @AnandaMahto,谢谢,我不知道需要多少个周期,而且在编写递归函数方面我还没有...
    【解决方案3】:

    我不知道打字的速度或数量,但这里有一种使用 qdap 的 beg2charchar2end 函数的方法:

    ## xx <- c("fefe.3. fregg, ff, 34.gr. trgw", 
    ##     "fefe3. fregg, ff, 34.gr. trgw",
    ##     "fefe3 fregg, ff, 34.gr. tr.gw")
    
    library(qdap)
    
    paste0(gsub("\\.", "", beg2char(xx, ",")), char2end(xx, ",", include=TRUE))
    
    ## > paste0(gsub("\\.", "", beg2char(xx, ",")), char2end(xx, ",", include=TRUE))
    ## [1] "fefe3 fregg, ff, 34.gr. trgw"  "fefe3 fregg, ff, 34.gr. trgw" 
    ## [3] "fefe3 fregg, ff, 34.gr. tr.gw"
    

    【讨论】:

    • 谢谢,这个方案对我来说绝对是最容易理解的。
    【解决方案4】:

    这使用gsubfn package 中的gsubfn 来提取从字符串开头开始且不包含逗号的最长子字符串。 (如果其中没有逗号,这将是整个字符串)。然后它使用gsub 删除其中的句点。 (如果只希望删除子字符串中的第一个句点,则将 gsub 更改为 sub。)

    library(gsubfn)
    gsubfn("^[^,]*", ~ gsub("\\.", "", x), xx)
    

    结果是:

    [1] "fefe3 fregg, ff, 34.gr. trgw" 
    [2] "fefe3 fregg, ff, 34.gr. trgw" 
    [3] "fefe3 fregg, ff, 34.gr. tr.gw"
    

    【讨论】:

    • 谢谢,gsubfn 很有趣!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多