R中的gsub()没有替换'.' (点)

Zak*_*Zak 39 regex r gsub

我想在更换点"2014.06.09""2014-06-09".我正在使用gsub()函数.如果

x <-  "2014.06.09"
gsub('2', '-' ,x)
# [1] "-014.06.09"
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试

gsub('.', '-', x)
# [1] "----------"
Run Code Online (Sandbox Code Playgroud)

而不是"2014-06-09".

class(x)
# "character"
Run Code Online (Sandbox Code Playgroud)

有些人可以建议我一个正确的方法,以及为什么它不适用于'.'(点)

akr*_*run 74

您可能需要转义.哪个特殊字符意味着"任何字符"(来自@Mr Flick的评论)

 gsub('\\.', '-', x)
 #[1] "2014-06-09"
Run Code Online (Sandbox Code Playgroud)

要么

gsub('[.]', '-', x)
#[1] "2014-06-09"
Run Code Online (Sandbox Code Playgroud)

或者正如评论中提到的@Moix,我们也可以使用fixed=TRUE而不是转义字符.

 gsub(".", "-", x, fixed = TRUE)
Run Code Online (Sandbox Code Playgroud)

  • 或者使用`fixed = TRUE`,它不使用正则表达式,而只是搜索字符.`gsub("."," - ",x,fixed = T)` (10认同)
  • @drmariod是的,这是另一种选择 (2认同)
  • 如果我们想用空格之类的其他东西来改变每一个标点符号怎么办?在处理来自社交媒体或评论的文本时,我在单词之间添加了很多点或其他标点符号,因为他们在完成句子后忘记使用空格。 (2认同)
  • @MehdiAbbassi你可以做 `gsub("[[:punct:]]", " ", x)` (2认同)

Wae*_*ael 6

对于更复杂的任务,stringr 包可能会很有趣

https://cran.r-project.org/web/packages/stringr/vignettes/stringr.html

https://github.com/rstudio/cheatsheets/raw/master/strings.pdf

library(stringr)

str_replace_all(x,"\\.","-")
## [1] "2014-06-09"
Run Code Online (Sandbox Code Playgroud)

或者

str_replace_all(x,"[.]","-")
## [1] "2014-06-09"
Run Code Online (Sandbox Code Playgroud)


Maë*_*aël 5

使用 R 4.0.0 中引入的原始字符串,可以做到

gsub(r"(\.)", "-", x)
# [1] "2014-06-09"
Run Code Online (Sandbox Code Playgroud)