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

Regex 删除字符串中第一个逗号之前的句点,regex,r,gsub,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") 我从gsub(“\\.”,“,”,xx))开始,它删除了所有句点。如何将其更改为“仅指定第一个逗号前的句点”?尝试以下操作: gsub("\\.(.*,.*)","\\1", xx) [1]

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

 xx <- c("fefe.3. fregg, ff, 34.gr. trgw", 
          "fefe3. fregg, ff, 34.gr. trgw",
          "fefe3 fregg, ff, 34.gr. tr.gw")
我从
gsub(“\\.”,“,”,xx))
开始,它删除了所有句点。如何将其更改为“仅指定第一个逗号前的句点”?

尝试以下操作:

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

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

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"

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

结果是:

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

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

## 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"
#xx粘贴0(gsub(“\\.”,“”,beg2char(xx,“”),char2end(xx,“,”,include=TRUE))
##[1]“fefe3-fregg,ff,34.gr.trgw”“fefe3-fregg,ff,34.gr.trgw”
##[3]“三价铁弗雷格,ff,34.gr.tr.gw”

谢谢您提供的详细信息,非常感谢。用你的行,我在第一项中仍然有一个句号:
“fefefe3.fregg,ff,34.gr.trgw”
(当示例数据有点不同时,你可能已经得到了我的Q的早期编辑,很抱歉混淆!)@Ben你可以将Andrie的
gsub
嵌套在这里,也可以得到你的答案:
gsub(\\.(.*),“\\1”,gsub(\.(.*),“\\1”,xx)
。这取决于你是否知道在第一个逗号之前可以使用多少个句点,或者你编写递归函数的技能……@AnandaMahto,谢谢,我不知道应该使用多少个句点,我还没有编写递归函数……非常感谢!这在我的实际用例中也起到了作用。我认为也许有一个字符更少的解决方案(我是一个懒惰的打字员),但这让我走上了正轨,这才是这个案子中最重要的。再次感谢!@Ben,我肯定有,但有时对正则表达式想得太多会让我大脑冻结。:)嘿!我完全明白你的意思。我是一个完全的正则表达式白痴。谢谢,那
gsubfn
很有趣!谢谢你,这个解决方案绝对是最好的对我来说最容易理解。
[1] "fefe3 fregg, ff, 34.gr. trgw" 
[2] "fefe3 fregg, ff, 34.gr. trgw" 
[3] "fefe3 fregg, ff, 34.gr. tr.gw"
## 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"