我想删除字符串中第二个及以后出现的小数点。我的尝试如下:
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。任何提示,请。
3.99-013
kuarbcqp1#
一个简洁的解决方案基于后视:
library(stringr) str_remove_all(x, "(?<=\\..{0,10})\\.") [1] "3.99-01322" "3.99013"
这里,后视(?<=\\..{0,10})Assert在执行str_remove_all操作之前.必须已经发生。数据:
(?<=\\..{0,10})
str_remove_all
.
x <- c("3.99-0.13.2.2", "3.990.13")
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"
注意:stringr的str_sub似乎没有replace_all选项,因此我们需要stringi(也就是说,如果您愿意,可以使用stringr::str_locate_all代替stri_locate_all_regex)。
stringr
str_sub
replace_all
stringi
stringr::str_locate_all
stri_locate_all_regex
<= 2
bf1o4zei3#
一种使用sub和gsub的方法,具有简单的正则表达式模式,可以处理各种可能的输入。提取第一部分,然后删除所有点从第二部分,最后粘贴在一起。
sub
gsub
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"
3条答案
按热度按时间kuarbcqp1#
一个简洁的解决方案基于后视:
这里,后视
(?<=\\..{0,10})
Assert在执行str_remove_all
操作之前.
必须已经发生。数据:
e5nszbig2#
我们可以找到所有出现的
.
,排除第一个,并删除其余的:输出:
注意:
stringr
的str_sub
似乎没有replace_all
选项,因此我们需要stringi
(也就是说,如果您愿意,可以使用stringr::str_locate_all
代替stri_locate_all_regex
)。<= 2
示例。bf1o4zei3#
一种使用
sub
和gsub
的方法,具有简单的正则表达式模式,可以处理各种可能的输入。提取第一部分,然后删除所有点从第二部分,最后粘贴在一起。
数据
应用