R语言 删除字符串中第二个及后续出现的小数点

q5lcpyga  于 2023-01-22  发布在  其他
关注(0)|答案(3)|浏览(455)

我想删除字符串中第二个及以后出现的小数点。我的尝试如下:

library(stringr)
str_remove(string = "3.99-0.13", pattern = "\\.")
[1] "399-0.13"
sub("\\.", "", "3.99-0.13")
[1] "399-0.13"

但是,我希望输出像3.99-013。任何提示,请。

kuarbcqp

kuarbcqp1#

一个简洁的解决方案基于后视:

library(stringr)
str_remove_all(x, "(?<=\\..{0,10})\\.")
[1] "3.99-01322" "3.99013"

这里,后视(?<=\\..{0,10})Assert在执行str_remove_all操作之前.必须已经发生。
数据:

x <- c("3.99-0.13.2.2", "3.990.13")
e5nszbig

e5nszbig2#

我们可以找到所有出现的.,排除第一个,并删除其余的:

library(stringi)

x <- c("3.99-0.13.2.2", "3.990.13")

stri_sub_replace_all(x,
                     lapply(stri_locate_all_regex(x, '\\.'), \(x) x[-1,, drop = FALSE]),
                     replacement = "")

输出:

"3.99-01322" "3.99013"

注意:stringrstr_sub似乎没有replace_all选项,因此我们需要stringi(也就是说,如果您愿意,可以使用stringr::str_locate_all代替stri_locate_all_regex)。

    • 更新:**现在适用于<= 2示例。
bf1o4zei

bf1o4zei3#

一种使用subgsub的方法,具有简单的正则表达式模式,可以处理各种可能的输入。
提取第一部分,然后删除所有点从第二部分,最后粘贴在一起。

数据
stri <- c("3.99-0.13", "393.99.0.13.0.0", ".832.723.723", "3.Ud.2349_3.", 
"D.235.2")

stri
[1] "3.99-0.13"       "393.99.0.13.0.0" ".832.723.723"    "3.Ud.2349_3."   
[5] "D.235.2"

应用

paste0(sub("\\..*", ".", stri), gsub("\\.", "", sub(".*?\\.", "", stri)))
[1] "3.99-013"    "393.9901300" ".832723723"  "3.Ud2349_3"  "D.2352"

相关问题