如何在R中从字符串中删除第n个出现的字符?

agyaoht7  于 2024-01-03  发布在  其他
关注(0)|答案(7)|浏览(77)

我有下面的字符串。

"File-2022-03-08-S1-PAR-C-J1-SET"

字符串
如何删除第二次和第三次出现的破折号(-)符号并保留所有其他符号?本质上,我希望日期(2023-03-08)读为2023 -03- 08。

dxxyhpgq

dxxyhpgq1#

不确定,但你希望结果像File-20220308-S1-PAR-C-J1-SET一样吗
如果是,则可以使用以下方法实现:

string <- "File-2022-03-08-S1-PAR-C-J1-SET"

modifiedString <- gsub("-(\\d{4})-(\\d{2})-", "-\\1\\2", string)

modifiedString

字符串

s4chpxco

s4chpxco2#

四处看看。

> gsub(r"{-(?=\d{2}\D)}", "", "File-2022-03-08-S1-PAR-C-J1-SET", perl=TRUE)
[1] "File-20220308-S1-PAR-C-J1-SET"

字符串

t8e9dugd

t8e9dugd3#

比较基准:

> library(microbenchmark)
> library(stringr)
> string <- "File-2022-03-08-S1-PAR-C-J1-SET"
> pattern <- "\\b[0-9]{4}-[0-9]{2}-[0-9]{2}\\b"
> microbenchmark(
    Chris = str_remove_all(string, "(?<=\\d)-(?=\\d)"), 
    jay.sf = gsub(r"{-(?=\d{2}\D)}", "", string, perl=TRUE), 
    Manoj = gsub("-(\\d{4})-(\\d{2})-", "-\\1\\2", string), 
    Rui = gsub("(^[^-]*-[^-]*)-([^-]*)-(.*$)", "\\1\\2\\3", string),
    TarJae = str_replace(string, pattern, str_remove_all(str_extract(string, pattern), "-"))
  )
Unit: microseconds
   expr    min      lq     mean  median      uq     max neval
  Chris 28.003 29.1510 31.85003 29.6020 30.8525 177.161   100
 jay.sf  6.027  6.5600  7.13359  6.8265  7.1545  24.272   100
  Manoj  7.093  7.4620  8.17991  7.7490  8.0565  30.094   100
    Rui  8.323  8.8560  9.67641  9.1430  9.5530  19.147   100
 TarJae 68.880 71.2375 74.03329 71.9960 74.5380 129.109   100

字符串

ccgok5k5

ccgok5k54#

假设输入总是所示的形式,这是一个字符串不包含-该字符串后面是-和所示的日期(即年,这不是2个字符,然后-和月,这是2个字符,然后-和天)。
然后这里是一个紧凑的基本解决方案,它查找第一次出现的-后跟两个字符和另一个-并将其替换为这两个字符:

x <- "File-2022-03-08-S1-PAR-C-J1-SET"
sub("-(..)-", "\\1", x)
## [1] "File-20220308-S1-PAR-C-J1-SET"

字符串

jecbmhm3

jecbmhm35#

这是一个基本的R解决方案。

x <- "File-2022-03-08-S1-PAR-C-J1-SET"
gsub("(^[^-]*-[^-]*)-([^-]*)-(.*$)", "\\1\\2\\3", x)
#> [1] "File-20220308-S1-PAR-C-J1-SET"

字符串
创建于2023-12-24使用reprex v2.0.2

xkrw2x1b

xkrw2x1b6#

下面是stringr函数与regex的组合:

library(stringr)

string <- "File-2022-03-08-S1-PAR-C-J1-SET"

# match date with format YYYY-MM-DD
pattern <- "\\b[0-9]{4}-[0-9]{2}-[0-9]{2}\\b"

str_replace(string, pattern, str_remove_all(str_extract(string, pattern), "-"))

个字符

piv4azn7

piv4azn77#

您可以使用look-around语法。
也就是说,如果-前面是d igit (?<=\\d),后面是d igit (?=\\d),则可以删除破折号字符:

library(stringr)
str_remove_all(string, "(?<=\\d)-(?=\\d)")
[1] "File-20220308-S1-PAR-C-J1-SET"

字符串

相关问题