删除字符串中第一个逗号之前的句点

时间:2013-06-30 05:32:56

标签: regex r gsub

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

 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))开始,删除了所有句号。如何更改它以指定“仅第一个逗号之前的时段”?

4 个答案:

答案 0 :(得分:4)

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

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,然后把它们放在一起重新走到一起。不太可能有效....

答案 1 :(得分:3)

试试这个:

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指的是第一组

答案 2 :(得分:1)

这使用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"

答案 3 :(得分:1)

我不知道速度或打字数量,但这是使用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"